소스 코드
for tc in range(1, 11):
# 노드의 수
n = int(input())
# str값으로 받음
# 정점의 값이 1부터 들어와서 앞에 리스트 하나 추가해서 index값 맞추기
nodes = [[0]] + [list(input().split()) for _ in range(n)]
# 부모 노드, 현재 값, 사칙연산
board = [[0,0,0] for _ in range(n+1)]
for q in range(n + 1):
# 정점이 연산자인 경우
if len(nodes[q]) == 4:
idx, car, left, right = nodes[q]
# 현재 위치에 사칙연산 입력
# 자식노드에 부모노드 값 입력
board[q][2] = car
board[int(left)][0] = q
board[int(right)][0] = q
# 정점이 단순 수인 경우
elif len(nodes[q]) == 2:
idx, num = nodes[q]
# 현재 위치에 수 입력
board[q][1] = int(num)
for w in range(n//2):
# 2*n이랑 2*n+1이랑은 한 쌍
# 2*n위치의 부모 값을 확인하고
# 2*n과 2*n+1과 부모 값에 입력된 연산자로 연산
# 나온 값을 부모 노드의 현재 값에 입력
if board[board[n-2*w-1][0]][2] == '+':
board[board[n - 2 * w-1][0]][1] = board[n - 2 * w - 1][1] + board[n - 2 * w][1]
elif board[board[n-2*w-1][0]][2] == '-':
board[board[n - 2 * w-1][0]][1] = board[n - 2 * w - 1][1] - board[n - 2 * w][1]
elif board[board[n-2*w-1][0]][2] == '*':
board[board[n - 2 * w-1][0]][1] = board[n - 2 * w - 1][1] * board[n - 2 * w][1]
else:
board[board[n - 2 * w-1][0]][1] = board[n - 2 * w - 1][1] / board[n - 2 * w][1]
print('#{} {}'.format(tc,int(board[1][1])))
해결 방법
1. node의 끝 부분부터 차례대로 연산하면서 진행해서 문제 해결
2. 2*n값과 2*n+1의 값은 한 쌍임(하나의 부모에서 나온 값들 == 부모노드의 연산자를 공유)
느낀 점
1. 2차원 배열을 선언할 때, [[0,0,0]]*(n+1)처럼 *를 사용하면 문제가 발생할 수 있음
-> *를 사용한 후 board[0][1] = 1입력하면, 모든 [1]위치의 값들이 1로 변함
-> 이는 얕은 복사 때문이라고 함
-> 고로 for문을 이용해서 배열을 만들자
2. 처음에는 단순히 1-> 23 2 -> 45 이런식으로 노드 n의 자식 노드의 index는 n*2, n*2+1인줄 알았는데
3. 중간중간 내가 생각한 규칙과는 다른 값들이 있었다
4. 그래서 부모노드를 따로 저장해서 문제를 해결함
ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.
오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.
혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.
'코딩 문제해결 > 문제 풀이.SWEA' 카테고리의 다른 글
[SWEA 코딩] 틱택톰 - PYTHON #11545 (0) | 2021.03.13 |
---|---|
[SWEA 코딩] 가장 빠른 문자열 타이핑 - PYTHON #3143 (0) | 2021.03.11 |
[SWEA 코딩] S/W 문제해결 기본 중위순회 - PYTHON #1231 (0) | 2021.03.05 |
[SWEA 코딩] S/W 문제해결 기본 미로1 - PYTHON #1226 (0) | 2021.03.05 |
[SWEA 코딩] S/W 문제해결 기본 길찾기 - PYTHON #1219 (0) | 2021.03.05 |