티스토리 뷰

SMALL

문제 설명

https://www.acmicpc.net/problem/11725

루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.

출력

첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.

예제 입력 1

7
1 6
6 3
3 5
4 1
2 4
4 7

예제 출력 1

4
6
1
3
1
4

예제 입력 2

12
1 2
1 3
2 4
3 5
3 6
4 7
4 8
5 9
5 10
6 11
6 12

예제 출력 2

1
1
2
3
3
4
4
5
5
6
6

풀이 과정

각 노드의 부모가 누구인지만 알면 됩니다. 저는 DFS가 더 익숙해서 DFS로 풀었습니다.

일반적인 DFS를 구현하면 되는데 현재 노드의 자식들을 탐색하고 재귀 호출을 통해 자식의 자식으로 들어가기 전에, 현재 노드가 현재 자식의 부모라는 것을 저장해 두면 됩니다.

정답 코드

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10 ** 5 + 1)  # 인풋 맥스가 10**5라서 10**5로 하면 에러가 남

N = int(input())
graph = [[] for _ in range(N + 1)]
visited = [False] * (N + 1)
answer = [0] * N

# 연결된 두 정점을 입력으로 받아서 양방향 그래프를 구성
for i in range(1, N):
    u, v = map(int, input().split())
    graph[u].append(v)
    graph[v].append(u)

def DFS(node):
    # node번 노드 방문 처리
    visited[node] = True
    # node번 노드의 자식들을 탐색
    for next in graph[node]:
        # next번 노드가 아직 방문된 적 없으면
        if not visited[next]:
            # next번 노드의 부모는 node번 노드임을 저장
            answer[next - 1] = node
            # next번 노드의 자식을 찾으러 재귀 호출
            DFS(next)

DFS(1)

for i in range(1, N):
    print(answer[i])

이상입니다.

LIST
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함