백준 20924 - 트리의 기둥과 가지

Computer Science/Problem Solving

문제 설명

문제에 사진이 많아 글로 작성하겠습니다.

루트 노드에서 순회를 시작했을 때, 처음으로 자식 노드가 2개 이상인 노드를 기가 노드라고 명칭한다. 기둥-가지를 줄여 기가 노드라 이름 붙였다.

여기서 루트 노드부터 기가 노드까지의 거리와 기가 노드로부터 가장 먼 리프 노드까지의 거리를 출력하는 문제이다.

입출력 및 제한 사항

풀이

2단계로 나누어서 풀이를 생각했다.

1. 루트노드가 아닌 노드들은 기가노드 이전까지 연결되어있는 모든 노드의 개수가 2개이므로 해당 조건으로 기가노드를 찾는다.

2. 기가노드로부터 DFS로 탐색하여 가장 멀리있는 노드까지의 거리를 구함.

루트노드로부터 직접 DFS를 탐색해도 괜찮지만 그렇게 된다면 기가 노드로부터의 거리를 다시 계산해야하기 때문에 DFS의 출발점을 기가노드로 잡았다.

내 코드

import sys
input = sys.stdin.readline
mis = lambda: map(int, input().split())

n, r = mis()
tree = [[] for _ in range(n+1)]
for _ in range(n-1):
    a, b, d = mis()
    
    tree[a].append((b, d))
    tree[b].append((a, d))
    
parent = 0
giga = r
giga_dis = 0

while True:
    deg = len(tree[giga])
    
    if giga == r:
        if deg != 1:
            break
    else:
        if deg != 2:
            break
    
    for nx, w in tree[giga]:
        if nx != parent:
            giga_dis += w
            parent, giga = giga, nx
            break

leaf_dis = 0
stack = [(giga, parent, 0)]
while stack:
    node, pa, dist = stack.pop()
    is_leaf = True
    
    for nx, w in tree[node]:
        if nx == pa:
            continue
        
        is_leaf = False
        stack.append((nx, node, dist + w))
        
    if is_leaf:
        if dist > leaf_dis:
            leaf_dis = dist

print(giga_dis, leaf_dis)

풀이는 평범한 DFS 풀이지만 재귀를 사용하지 않고 stack을 사용하여 풀이했다. 그 이유는 트리가 한 줄로 길게 이어질 수 있기 때문에 재귀 스택을 고려하여 stack을 선택했다. 신경써서 구현한 점은 방향 그래프라는 명시가 없었기 때문에 양방향이라고 가정하고 부모 노드를 다시 탐색하지 않는 것을 신경써서 풀이했다.

 

또한 기가 노드를 찾을 때 아래 코드에서 break를 해주지 않았다가 시간초과를 받았다...

for nx, w in tree[giga]:
    if nx != parent:
        giga_dis += w
        parent, giga = giga, nx
        break

처음엔 별 생각 없이 노드의 수가 2개니까 모두 순회했는데 처음에 자식노드를 탐색하면 parent가 바뀌기 때문에 이상한 루프에 빠질 수 있다는 것을 간과했다.

'Computer Science > Problem Solving' 카테고리의 다른 글

백준 1106 - 호텔  (0) 2025.09.09
백준 12969 - ABC  (1) 2025.09.05
백준 9421 - 소수상근수  (0) 2025.09.03
백준 5624 - 좋은 수  (0) 2025.09.01
백준 14607 - 피자 (Large)  (0) 2025.08.26
'Computer Science/Problem Solving' 카테고리의 다른 글
  • 백준 1106 - 호텔
  • 백준 12969 - ABC
  • 백준 9421 - 소수상근수
  • 백준 5624 - 좋은 수
hojoo
hojoo
그냥 개발이 즐거운 사람
  • hojoo
    dev_record
    hojoo
  • 전체
    오늘
    어제
    • 분류 전체보기 (82)
      • Study (0)
        • 모든 개발자를 위한 HTTP 웹 기본 지식 (0)
        • Real MySQL 8.0 (0)
        • 친절한 SQL 튜닝 (0)
        • 도메인 주도 개발 시작하기 (0)
        • 대규모 시스템 설계 기초 (0)
      • Computer Science (66)
        • Problem Solving (30)
        • Data Structure (4)
        • Spring Boot (13)
        • DB (1)
        • Java (4)
        • OS (3)
        • Server (2)
        • Tech (0)
      • Security (16)
        • Reversing (15)
        • Assembly (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    2539
    x64dbg
    n+1
    Reversing
    서버 증설 횟수
    16946
    servlet
    리버싱
    Lena tutorial
    12033
    PE header
    21278
    19622
    프로그래머스
    소수상근수
    DP
    레나 튜토리얼
    15973
    13265
    Header
    DB
    HTTP
    리버싱 핵심원리
    dreamhack.io
    9421
    bean
    n^2 배열 자르기
    Spring boot
    자료구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
hojoo
백준 20924 - 트리의 기둥과 가지
상단으로

티스토리툴바