- 문제 : https://www.acmicpc.net/problem/2250

 

이진트리니까 부모노드는 최대 2개의 자식 노드를 가질 수 있다 

 

잎 노드가 아닐 때까지 연결 정보를 isRoot에 담은 뒤 이걸 바탕으로 root 노드를 찾는다 

루트노드부터 각 깊이별로 탐색해 가는 건 이해가 간다

 

너비는 같은 깊이에 있는 노드들의 컬럼 값 차이가 결정한다 

왼쪽 잎 노드가 나올때까지 dfs를 진행한다음, 왼쪽 잎 노드가 나오면 (data[start][0] == -1) 

그 노드의 깊이에 노드의 열 번호를 삽입한다. (특정 깊이에 해당하는 노드들의 열 번호가 삽입 된다)

잎 노드 dfs 끝나면 그 부모노드의 정보 삽입 되고, 그것의 오른쪽 노드로 진행된다,,,,

그래서 각 레벨에 해당되는 노드들의 열 번호들이 distance에 입력되고, 그 중 최댓값과 최솟값의 차이 중 최댓값을 출력하면된다

 

- 정답 풀이 : 

 

import sys
input = sys.stdin.readline

n = int(input())
data = [[] for _ in range(n+1)]

isRoot = [0]*(n+1)
root = 0

#트리의 너비 구하기 위한 행렬 
distance = [[] for _ in range(n+1)]

for _ in range(n):
    parent, left, right = map(int,input().split())
    data[parent].append(left)
    data[parent].append(right)
    isRoot[parent]+=1
    if left != -1:
        isRoot[left] += 1
    if right != -1:
        isRoot[right] += 1

#루트 노드 설정하기        
for i in range(1,n+1):
    if isRoot[i] == 1:
        root=i

num = 1        
def dfs(start, depth) :
    global num
    if data[start][0] != -1:
        dfs(data[start][0], depth + 1)
    distance[depth].append(num)
    num += 1
    if data[start][1] != -1:
        dfs(data[start][1], depth+1)
        
dfs(root,1)
level = 1
answer = max(distance[1]) - min(distance[1]) + 1

for i in range(2,n+1):
    if distance[i] :
        large = max(distance[i])
        small = min(distance[i])
        if answer < large - small + 1:
            answer = large - small + 1
            # 너비가 큰 깊이를 저장함
            level=i
            
print(level,answer)

'백준 > Search' 카테고리의 다른 글

[dfs/백준] 1405번 : 미친 로봇  (0) 2022.08.09
[bfs/백준] 17471번 : 게리맨더링  (0) 2022.08.08
[dfs/백준] 1987번 : 알파벳  (0) 2022.08.06
[bfs/백준] 3184번 : 양  (0) 2022.08.05
[dfs/백준] 13023번 : ABCDE  (0) 2022.08.05

+ Recent posts