메모/알고리즘

[백준] Python - 트리

Floodnut 2021. 10. 10. 04:59
 

1068번: 트리

첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다

www.acmicpc.net

 

트리의 리프 노드의 개수를 확인하는 문제다.

내 개인 서버에서는 잘 돌아가는데 백준 테스트 케이스에서 어떤 경우가 있는지 몰라서 예제만 확인했더니...

에러를 해결하지 못했다.

 

그래서 어떤 알고리즘으로 찾아 힌트를 봤더니 dfs를 쓴다 했다.

깊이 우선 탐색을 재귀로 짜서 리프노드에 도달하면 갯수 +1 하고 리턴, 삭제노드의 부모가 자식이 1개면 갯수 +1 이런식으로 구현했다.

더보기
from sys import stdin

n = int(stdin.readline())
parent = list(map(int, stdin.readline().split()))
d = int(stdin.readline())
tree = [[] for _ in range(n)]
leafCount = 0

for i in range(0, n):
    if parent[i] != -1:
        tree[parent[i]].append(i)
    else:
        root = i

def dfs(node):
    global leafCount, d

    if len(tree[node]) == 0 : 
        leafCount += 1
        return
    else:
        for i in tree[node]:
            if i == d and len(tree[node]) == 1: 
                leafCount += 1
            elif i == d : 
                continue
            else: 
                dfs(i)

if d == root: 
    print(0)
else:
    dfs(root)
    print(leafCount)