2250번: 트리의 높이와 너비
첫째 줄에 노드의 개수를 나타내는 정수 N(1 ≤ N ≤ 10,000)이 주어진다. 다음 N개의 줄에는 각 줄마다 노드 번호와 해당 노드의 왼쪽 자식 노드와 오른쪽 자식 노드의 번호가 순서대로 주어진다. ��
www.acmicpc.net
# 각 레벨의 너비 중 최대값
def in_order(parent, row=1):
lc, rc = graph[parent]
if lc != -1:
in_order(lc, row + 1)
global col, maxRow
col += 1
minCol[row] = min(minCol[row], col)
maxCol[row] = max(maxCol[row], col)
maxRow = max(maxRow, row)
if rc != -1:
in_order(rc, row + 1)
N = int(input())
graph = [(0, 0) for _ in range(N+1)]
parent = [0] * (N+1)
for _ in range(N):
p, lc, rc = map(int, input().split())
graph[p] = (lc, rc)
if lc != -1:
parent[lc] = p
if rc != -1:
parent[rc] = p
# 전역변수
col = 0
minCol = [N] * (N+1) # [19, 10, 3, 2, 1, 4, 6]
maxCol = [1] * (N+1) # [ 1, 10, 15, 19, 18, 16, 17]
maxRow = 1
# 유의사항: 루트 노드를 구해야 한다
root = 0
for i in range(1, N+1):
if parent[i] == 0:
root = i
in_order(root)
max_w, lv = 1, 1
for i in range(1, maxRow+1):
w = maxCol[i] - minCol[i] + 1
if w > max_w:
max_w = w
lv = i
print(lv, max_w)
다른 풀이: 연결정보를 (노드 클래스)로 표현
class Node:
def __init__(self, p, lc, rc):
self.data = p
self.lc = lc
self.rc = rc
self.parent = -1 # 부모노드 (루트노드를 찾기 위해 추가)
def in_order(parent, row=1):
node = graph[parent]
if node.lc != -1:
in_order(node.lc, row + 1)
global col, maxRow
col += 1
minCol[row] = min(minCol[row], col)
maxCol[row] = max(maxCol[row], col)
maxRow = max(maxRow, row)
if node.rc != -1:
in_order(node.rc, row + 1)
N = int(input())
graph = [Node(i, 0, 0) for i in range(N+1)]
for _ in range(N):
p, lc, rc = map(int, input().split())
graph[p].lc = lc
graph[p].rc = rc
if lc != -1:
graph[lc].parent = p
if rc != -1:
graph[rc].parent = p
col = 0
maxCol = [1] * (N+1)
minCol = [N] * (N+1)
maxRow = 1
root = 0
for i in range(1, N+1):
if graph[i].parent == -1:
root = i
in_order(root)
max_w, lv = 1, 1
for i in range(1, maxRow+1):
w = maxCol[i] - minCol[i] + 1
if w > max_w:
max_w = w
lv = i
print(lv, max_w)
'BOJ 알고리즘 (패캠) > 정렬, 탐색' 카테고리의 다른 글
1715번: 카드 정렬하기 (힙) - Fastcampus (0) | 2020.10.07 |
---|---|
1927번: 최소 힙 (힙) - Fastcampus (0) | 2020.10.07 |
1991번: 트리 순회 (트리, 재귀) - Fastcampus (0) | 2020.10.07 |
1939번: 중량제한 (탐색, 이분탐색, BFS) - Fastcampus (0) | 2020.10.07 |
2110번: 공유기 설치 (탐색, 이분탐색) - Fastcampus (0) | 2020.10.07 |