이어서 다른 노드를 차례차례 방문하다가 8번째 순서로 5을 방문했을 경우
최소 열 번호는 그대로 2이지만, 최대 열 번호는 8로 갱신된다.
이런 식으로 모든 트리를 탐색하면, 각 깊이에 대한 최소 열 번호, 최대 열 번호를 얻을 수 있다.
최대 열 번호 - 최소 열 번호 + 1
을 구하면 너비를 구할 수 있다.import sys
input = sys.stdin.readline
def DFS(depth, node):
global col_num
left, right = tree[node]
# 중위 순회
if left != -1:
DFS(depth+1, left)
max_width[depth][0] = min(max_width[depth][0], col_num)
max_width[depth][1] = max(max_width[depth][1], col_num)
col_num += 1
if right != -1:
DFS(depth+1, right)
N = int(input())
tree = [() for _ in range(N+1)]
is_child = [False] * (N+1)
# 0. 입력 받기 (루트 찾을 수 있도록 is_child 리스트 갱신)
for _ in range(N):
parent, left, right = map(int, input().split())
tree[parent] = (left, right)
if left != -1:
is_child[left] = True
if right != -1:
is_child[right] = True
# 1. 루트 노드 찾기
start = is_child[1:].index(False) + 1
# 2. 트리 순회하면서 각 깊이별로 최소 열 번호, 최대 열 번호 찾기
max_width = [[2147000000, 0] for _ in range(N)]
col_num = 1
DFS(0, start)
# 3. 최대 너비를 갖는 레벨과 그 길이 찾고 출력하기
answer_row = 0
answer_width = 0
for i in range(N):
min_col, max_col = max_width[i]
if max_col == 0:
break
temp = max_col - min_col + 1
if temp > answer_width:
answer_width = temp
answer_row = i+1
print(answer_row, answer_width)