티스토리 뷰

참고

https://www.acmicpc.net/problem/1991

 

1991번: 트리 순회

첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 영문자

www.acmicpc.net


트리 순회를 스택을 이용한 반복문으로 구현하던 중 ','를 이용한 동시 할당에서 발생했던 문제점과 해결과정을 기록한다.

 

문제점

def iter_inorder(tree, node):
    stack = [node]
    while stack:
        while tree[node] and tree[node][0] != '.':
            # tree[node][0], node = '.', tree[node][0] # 1
            node, tree[node][0] = tree[node][0], '.' # 2
            stack.append(node)
        node = stack.pop()
        print(node, end='')
        if tree[node] and tree[node][1] != '.':
            node = tree[node][1]
            stack.append(node)

기존에는 ','를 사용한 동시 할당에 좌측 변수의 순서는 상관 없다고 생각 하였으나 검색 결과 변수 순서가 할당 순서에 영향을 줄 수도 있다는 것을 알게 되었다.

 

실제 주석 1번이 올바르게 동작하고 주석 2번이 오답을 출력한다.

 

해결과정

주석 1번의 변수 할당 과정을 풀어쓰면 아래와 같다.

temp = tree[node][0]
tree[node][0] = '.'
node = temp

내가 의도한 바 처럼 잘 동작한다.

 

주석 2번의 변수 할당 과정을 풀어쓰면 아래와 같다.

temp = node
node = tree[node][0]
tree[node][0] = '.'

temp[node][0] = '.' 에서 이미 node가 참조하는 값이 변경되었기 때문에 의도한대로 동작하지 않는다.  실제로 잘 동작하도록 풀어쓰면 아래와 같을 것이다.

temp = node
node = tree[node][0]
tree[temp][0] = '.'

일반적인 a, b =  b, a와 같은 동시할당에서는 문제가 발생하지 않겠지만 

 

위 같이 한 변수가 다른 변수의 key 값 혹인 인덱스 값일 경우에는 의도한 대로 동작하지 않을 수 있다.

728x90

'Python' 카테고리의 다른 글

[Python] urllib.request를 활용한 다운로드  (0) 2020.03.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함