[BOJ] 1068 트리

DFS


해당 문제는 개인적으로 생각했을때 훼이크가 좀 많은 문제라고 생각했다.

우선 문제를 풀며 지문을 제대로 읽어야 겠다는 생각을 한 부분이

  • 이진트리라고 명시되어 있지 않은 경우 자식은 여러개 일 수 있다.
  • 꼭 0번 노드가 루트노드가 아닐 수 있다.

위 부분을 놓치고 풀고 있었고 이를 배우는 좋은 계기가 되는 문제였다.

DFS로 푼 이유는, 트리를 깊이우선 탐색을 하며 내가 삭제할 노드를 만나면 하위 노드를 탐색하지 않고 return 하는 방식으로 구현을 하면 되겠다는 아이디어에서 비롯되었다. 코드는 아래와 같다.

구현


import sys

def dfs(node, leaf_count, node_to_del):
    if node == node_to_del:
        return leaf_count
    if not tree[node]:
        return leaf_count + 1
    for i in range(len(tree[node])):
        leaf_count = dfs(tree[node][i], leaf_count, node_to_del)
    return leaf_count

def solution(node_to_del):
    leaf_node = 0
    for root in roots:
        leaf_node += dfs(root, leaf_node, node_to_del)
    return leaf_node

if __name__ == "__main__":
    N = int(sys.stdin.readline().rstrip())
    parent = list(map(int, sys.stdin.readline().rstrip().split()))
    node_to_delete = int(sys.stdin.readline().rstrip())
    tree = [[] for _ in range(N)]
    roots = []
    for i in range(N):
        if parent[i] == -1:
            roots.append(i)
            continue
        if i == node_to_delete:
            continue
        tree[parent[i]].append(i)
    print(solution(node_to_delete))

태그:

카테고리:

업데이트: