[BaekJoon] 백준 1068번 : 트리

Updated:

1068번 : 트리


먼저 주어진 정보를 통해 트리를 만들고 노드를 지우기 이전에 리프노드 개수를 센다.

그리고 지우고자 하는 노드부터 탐색하여 리프노드 개수를 센다.

마지막으로 첫번째로 지우는 노드의 부모가 리프노드가 되는지 확인 한 뒤 계산을 한다.


from collections import deque


def BFS(tree, start):
    leaf_node = 0
    queue = deque([start])

    while queue:
        now = queue.popleft()
        if len(tree[now]) == 0:
            leaf_node += 1

        for node in tree[now]:
            queue.append(node)

    return leaf_node


def solution():
    # 1. 트리 생성
    tree = {node: [] for node in range(N)}
    for node, parent in enumerate(parent_info):
        if parent != -1:
            tree[parent].append(node)

    # 2. 전체 리프노드 개수 세기
    all_leaf_node = 0
    for child in tree.values():
        if len(child) == 0:
            all_leaf_node += 1

    # 3. 지우는 노드부터 탐색하여 리프노드 개수 세기
    remove_leaf_node = BFS(tree, remove_node)

    # 4. 첫번째 지우는 노드의 부모가 리프노드가 되는지 확인
    if parent_info[remove_node] != -1 and len(tree[parent_info[remove_node]]) == 1:
        remove_leaf_node -= 1

    return all_leaf_node - remove_leaf_node


if __name__ == "__main__":
    N = int(input())
    parent_info = list(map(int, input().rsplit()))
    remove_node = int(input())

    print(solution())



Categories:

Updated:

Leave a comment