티스토리 뷰
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
'Algorithm' 카테고리의 다른 글
SWEA 2007번: 패턴 마디의 길이 (D2) - Python 풀이 (0) | 2025.05.14 |
---|---|
SWEA 1989번: 초심자의 회문 검사 (D2) - Python 풀이 (0) | 2025.05.13 |
SWEA 1979번: 어디에 단어가 들어갈 수 있을까 (D2) - Python 풀이 (0) | 2025.05.11 |
백준 15655번: N과 M (6) (S3) - Python 풀이 (0) | 2025.05.11 |
백준 9095번: 1,2,3 더하기 (S3) - Swift 풀이 (0) | 2025.05.09 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 알고리즘
- ios
- 백트래킹
- 구현
- Programmers
- MySQL
- Baekjoon
- 코딩테스트
- 그리디
- 힙
- Deque
- BFS
- D2
- D3
- swea
- dp
- Swift로백준풀기
- dfs
- 코테준비
- 완전탐색
- 이분탐색
- SQL
- Swift
- 스택
- Python
- 백준
- 큐
- 투포인터
- 다이나믹프로그래밍
- 프로그래머스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함