소스 코드

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. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.

 

오류적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.

 

혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.