Algorithm/SW Expert Academy

[Python] 5174. subtree

느낌표 공장장 2021. 9. 24. 17:25

후위 순회 풀이 

# 후위 순회 알고리즘 / 어떤 순회를 써도 상관 X
def postorder(n):
    global answer
    if n:
        postorder(left[n])
        postorder(right[n])
        answer += 1


tc = int(input())

for idx in range(1, tc+1):
    e, n = map(int, input().split())    # 간선의 개수 e, 시작 노드 n
    node = list(map(int, input().split()))  # 노드 연결 정보 받아오기

    left = [0 for _ in range(e+2)]  # 부모를 인덱스로 자식번호 저장
    right = [0 for _ in range(e+2)]

    for i in range(0, e*2, 2):
        p, c = node[i], node[i+1]   # 부모 자식 노드 가져오기
        if left[p]:      # p의 왼쪽 자식 있으면 오른쪽 자식으로 저장
            right[p] = c
        else:           # p의 왼쪽 자식 없으면 왼쪽에 저장
            left[p] = c

    answer = 0
    postorder(n)

    print('#{} {}'.format(idx, answer))

 

 

DFS 풀이

tc = int(input())

for idx in range(1, tc+1):
    e, n = map(int, input().split())    # 간선의 개수 e, 시작 노드 n
    temp = list(map(int, input().split()))  # 노드 연결 정보 받아오기

    node = [[] for _ in range(e+2)]   # 노드 연결 정보 정리
    for i in range(0, e*2, 2):
        node[temp[i]].append(temp[i+1])

    answer = 1
    stack = node[n] # dfs 풀이
    while stack:
        n = stack.pop()
        answer += 1
        for i in node[n]:
            stack.append(i)

    print('#{} {}'.format(idx, answer))

'Algorithm > SW Expert Academy' 카테고리의 다른 글

[Python] 5177. 이진힙  (0) 2021.09.24
[Python] 5176. 이진탐색  (0) 2021.09.24
[Python] 1232. 사칙연산  (0) 2021.09.24
[Python] 1231. 중위 순회  (0) 2021.09.23
[Python] 5105. 미로의 거리  (0) 2021.09.23