상세 컨텐츠

본문 제목

[백준/파이썬]1068 트리

알고리즘 문제풀이

by 한백인데용 2023. 9. 1. 23:37

본문

728x90
반응형

https://www.acmicpc.net/problem/1068

 

1068번: 트리

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

www.acmicpc.net

문제

백준 1068번 트리

이진트리가 주어졌을 때, 리프 노드라는 것의 개수를 구하는 문제다.

 

나는 이 문제를 풀 때 입력으로 주어지는 부모 노드를 이용해 다음과 같이 인접 리스트를 만들어 준 후에 삭제할 노드를 삭제하고 리프 노드 카운팅을 해줬다.

path = [[] for _ in range(n)]

for i in range(n) :
    if node[i] == -1 :
        root_node = i
    else :
        path[node[i]].append(i)

path[del_node] = []

 

 

그리고 이 문제를 풀고 처음 제출했을 때 78%에서 틀렸습니다가 나왔다.

 

알고 보니 트리가 일자로 쭉 이어졌을 경우 (0 -> 1 -> 2 -> 3)를 처리해주지 못해서 틀렸다고 나왔었다.

 

정답

def dfs(node_idx) :
    global count
    if len(path[node_idx]) == 0 and node_idx != root_node:
        count+=1
        return
    elif len(path[node_idx]) == 1 and path[node_idx][0] == del_node :
        count += 1
        return
    for child in path[node_idx] :
        if child != del_node :
            dfs(child)

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

path = [[] for _ in range(n)]

for i in range(n) :
    if node[i] == -1 :
        root_node = i
    else :
        path[node[i]].append(i)

path[del_node] = []

count = 0
dfs(root_node)

print(count)

 

728x90
반응형

관련글 더보기