https://www.acmicpc.net/problem/1068
1068번: 트리
첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다
www.acmicpc.net
import sys
si = lambda : sys.stdin.readline().rstrip()
l = lambda : list(map(int, si().split()))
def dfs(root) : # x의 subtree에 대해 leaf[x]를 계산해주는 함수
if not child[root] : # 아무것도 없다면 리프노드
leaf[root] = 1
for node in child[root] : # 자식이 존재한다면
dfs(node) # 탐색 수행
leaf[root] += leaf[node] # 탐색하고 나와서 리프노드의 수만큼 저장
n = int(si())
child = [[] for _ in range(n)]
leaf = [0 for _ in range(n)]
lst = l()
root = -1
for i in range(len(lst)) :
if lst[i] == -1 :
root = i
continue
child[lst[i]].append(i)
erased = int(si())
for i in range(n) : # remove할 노드를 찾아서 제거 => 탐색자체를 못하게 함.
if erased in child[i] :
child[i].remove(erased)
if root != erased : # 만약 타겟이 root노드가 아니라면 탐색을 수행
dfs(root)
print(leaf[root]) # 타겟이 root라면 해당 조건을 넘어가서 0이 출력될 것