티스토리 뷰
https://www.acmicpc.net/problem/2250
문제
이진트리를 다음의 규칙에 따라 행과 열에 번호가 붙어있는 격자 모양의 틀 속에 그리려고 한다. 이때 다음의 규칙에 따라 그리려고 한다.
- 이진트리에서 같은 레벨(level)에 있는 노드는 같은 행에 위치한다.
- 한 열에는 한 노드만 존재한다.
- 임의의 노드의 왼쪽 부트리(left subtree)에 있는 노드들은 해당 노드보다 왼쪽의 열에 위치하고, 오른쪽 부트리(right subtree)에 있는 노드들은 해당 노드보다 오른쪽의 열에 위치한다.
- 노드가 배치된 가장 왼쪽 열과 오른쪽 열 사이엔 아무 노드도 없이 비어있는 열은 없다.
이와 같은 규칙에 따라 이진트리를 그릴 때 각 레벨의 너비는 그 레벨에 할당된 노드 중 가장 오른쪽에 위치한 노드의 열 번호에서 가장 왼쪽에 위치한 노드의 열 번호를 뺀 값 더하기 1로 정의한다. 트리의 레벨은 가장 위쪽에 있는 루트 노드가 1이고 아래로 1씩 증가한다.
아래 그림은 어떤 이진트리를 위의 규칙에 따라 그려 본 것이다. 첫 번째 레벨의 너비는 1, 두 번째 레벨의 너비는 13, 3번째, 4번째 레벨의 너비는 각각 18이고, 5번째 레벨의 너비는 13이며, 그리고 6번째 레벨의 너비는 12이다.
우리는 주어진 이진트리를 위의 규칙에 따라 그릴 때에 너비가 가장 넓은 레벨과 그 레벨의 너비를 계산하려고 한다. 위의 그림의 예에서 너비가 가장 넓은 레벨은 3번째와 4번째로 그 너비는 18이다. 너비가 가장 넓은 레벨이 두 개 이상 있을 때는 번호가 작은 레벨을 답으로 한다. 그러므로 이 예에 대한 답은 레벨은 3이고, 너비는 18이다.
임의의 이진트리가 입력으로 주어질 때 너비가 가장 넓은 레벨과 그 레벨의 너비를 출력하는 프로그램을 작성하시오
코드
import sys
n = int(sys.stdin.readline())
graph = [[] for _ in range(n + 1)]
isRoot = [0] * (n + 1)
distance = [[] for _ in range(n + 1)]
root = 0
for _ in range(n):
parent, left, right = map(int, sys.stdin.readline().rstrip().split())
graph[parent].append(left)
graph[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 inorder(start, deep):
global num
if graph[start][0] != -1:
inorder(graph[start][0], deep + 1)
distance[deep].append(num)
num += 1
if graph[start][1] != -1:
inorder(graph[start][1], deep + 1)
inorder(root, 1)
level = 1
ans = max(distance[1]) - min(distance[1]) + 1
for i in range(2, n + 1):
if distance[i]:
small = min(distance[i])
large = max(distance[i])
if ans < large - small + 1:
ans = large - small + 1
level = i
print(level, ans)
풀이
각 레벨에 깊이의 값을 넣으며 중위순회를 한다. 가장 넓은 너비의 레벨을 찾아 너비와 함께 출력한다.
'학습 내용 > 백준 문제풀이' 카테고리의 다른 글
백준 1167 파이썬 - 트리의 지름 (0) | 2022.01.22 |
---|---|
백준 11725 파이썬 - 트리의 부모 찾기 (0) | 2022.01.22 |
백준 1991 파이썬 - 트리 순회 (0) | 2022.01.20 |
백준 1261 파이썬 - 알고스팟 (0) | 2022.01.20 |
백준 13549 파이썬 - 숨바꼭질 3 (0) | 2022.01.20 |