BOJ-1068 - Python

n개의 노드로 이루어진 트리를 각 노드의 부모들의 번호를 입력받으며 주어진다. 그 후 지울 노드 번호를 입력받으며 해당 트리의 리프 노드의 수를 출력하는 문제. 첫 풀이는 지워지지 않은 노드들을 저장하는 배열을 이용하여 확인하여 수를 세는 방식으로 하였으나, 지운 노드를 유일한 자식으로 가지고 있는 노드의 반례를 풀지 못했으며 dfs 연산을 두 번하는 과정이 필요없을 것 같아 다시 풀게 되었다. 두번째 풀이는 dfs을 하며 노드의 자식이 없을 때 리프 노드라고 판단, 자식 노드를 큐에 추가할 때 삭제할 노드가 있으며 해당 노드의 길이가 1일 때도 리프 노드로 판단하는 부분을 넣어 풀었다. 수차례 괴롭히던 런타임 에러는 그래프를 먼저 생성하는 방식으로 해결하였다.

# def dfs(start):
#     q = [start]
#
#     while q:
#         node = q.pop()
#         is_alive[node] = False
#         for next in graph[node]:
#             q.append(next)
#
# def lif(root):
#     global ans
#     q = [root]
#     while q:
#         node = q.pop()
#         if graph[node] == [] and is_alive[node]:
#             ans += 1
#         elif len(graph[node]) and not is_alive[node]:
#
#         else:
#             for next in graph[node]:
#                 q.append(next)
#
# n = int(input())
# l = list(map(int, input().split()))
# del_node = int(input())
#
# is_alive = [True for _ in range(n)]
# ans = 0
#
# graph = {}
# root = 0
# for i in range(n):
#     graph[i] = []
#     if l[i] != -1:
#         graph[l[i]].append(i)
#     else:
#         root = i
# dfs(del_node)
# lif(root)
#
# print(graph)
# print(is_alive)
# print(ans)


def count_lif(root, del_node):
    global ans
    q = []
    if del_node != root:
        q = [root]

    while q:
        node = q.pop()

        if graph[node] == []:
            ans += 1

        for next in graph[node]:
            if next == del_node:
                if len(graph[node]) == 1:
                    ans += 1
            else:
                q.append(next)

n = int(input())
l = list(map(int, input().split()))
del_node = int(input())

ans = 0
graph = {}
root = 0

for i in range(n):
    graph[i] = []

for i in range(n):
    if l[i] != -1:
        graph[l[i]].append(i)
    else:
        root = i

count_lif(root, del_node)
print(ans)

Written by@hyesungoh
Learning every moment

InstagramGitHubLinkedIn