Algorithm (PS)

[백준] 5639 이진검색트리 in Python : tree 전위순회의 특성을 이용한 풀이 + EOF를 이용해서 입력받기

minjiwoo 2022. 2. 25. 10:49
728x90

try except 문은 이럴때 사용한다 !! 라는 것을 알게되었다. 

보통 입력값 갯수가 주어지는데 이문제에서는 안주어져서 어떻게 하나 싶었는데 파이썬에서는 EOF 에러를 잡을 수 있는 구문이 바로 except! 

except를 이용해서 예외적으로 오류를 처리할 수 있게 해준다. 

그리고 풀이는 전위순회의 특성을 이용해서 풀었다 

전위순회는 root -> left subtree -> right subtree 순서대로 순회한다. 즉, 

1) root는 array[0] # 맨 앞의 원소가 루트노드

2) array를 쭉 확인하다가 처음으로 root보다 큰 값이 나오면 이것이 바로 right subtree의 첫번째 원소가 되므로, left와 right 서브트리의 경계값이 된다 

이 두가지를 이용하여 postorder 함수를 구성하면 된다. 

 

# 5639 이진 검색 트리
import sys
sys.setrecursionlimit(10**6)
tree = []


def postorder(start, end):
    if start > end:
        return
    root = tree[start]
    idx = end+1

    for i in range(start+1, end+1):
        if root < tree[i]:
            idx = i # left sub tree 와 right subtree의 경계가 되는 index    
            break
    postorder(start+1, idx-1)
    postorder(idx, end)
    print(root)

while True:
    try:
        tree.append(int(input()))
    except: # EOF 입력되면 에러가 일어나는것을 이용
        break

postorder(0, len(tree)-1)
728x90