[ Backjoon - 11725번 ] 트리의 부모 찾기 ( java )
📚 Table of Contents
문제
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.
출력
첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.
예제
문제 풀이
코드 설명
코드의 목적:
- 이 코드는 트리의 각 노드의 부모 노드를 찾는 알고리즘을 구현합니다.
- 깊이 우선 탐색(DFS)을 사용하여 트리를 탐색하며 각 노드의 부모를 기록합니다.
코드의 주요 구조:
- 입력: 노드의 개수와 간선 정보 입력
- 그래프 표현: 인접 리스트로 트리 표현
- DFS 수행: 각 노드의 부모를 찾기 위해 DFS 탐색
- 결과 출력: 루트 노드(1번 노드)를 제외한 각 노드의 부모 노드 번호 출력
코드의 주요 알고리즘:
DFS 함수:
- 현재 노드(
current
)에서 인접한 노드들을 순회합니다. - 인접한 노드(
child
)가 이전 노드(prev
)가 아닌 경우,- 현재 노드를 인접 노드의 부모로 기록합니다(
parent[child] = current
). - 인접 노드를 시작점으로 DFS를 재귀적으로 수행합니다(
dfs(tree, parent, child, current)
).
- 현재 노드를 인접 노드의 부모로 기록합니다(
코드의 흐름:
- 입력: 노드 개수(
N
)와 간선 정보 입력 - 그래프 표현: 인접 리스트
tree
와 부모 노드 기록을 위한 배열parent
생성 - DFS 수행: 노드 1을 시작점으로 DFS 수행 (
dfs(tree, parent, 1, 0)
) - 결과 출력: 루트 노드(1번 노드)를 제외한 각 노드의 부모 노드 번호 출력
코드의 핵심:
- DFS 탐색을 통해 트리를 순회하면서 각 노드의 부모를 기록합니다.
- 인접 리스트 기반의 그래프 표현을 사용하여 탐색을 효율적으로 수행합니다.
풀이
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 입력: 노드의 개수와 간선 정보 입력
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
ArrayList<Integer>[] tree = new ArrayList[N + 1]; // 인접 리스트
int[] parent = new int[N + 1]; // 각 노드의 부모 노드 저장
// 그래프 표현: 인접 리스트로 트리 표현
for (int i = 1; i <= N; i++) {
tree[i] = new ArrayList<>();
}
for (int i = 0; i < N - 1; i++) {
int u = scanner.nextInt();
int v = scanner.nextInt();
tree[u].add(v);
tree[v].add(u);
}
// DFS 수행: 각 노드의 부모를 찾기 위해 DFS 탐색
dfs(tree, parent, 1, 0);
// 결과 출력: 루트 노드(1번 노드)를 제외한 각 노드의 부모 노드 번호 출력
for (int i = 2; i <= N; i++) {
System.out.println(parent[i]);
}
scanner.close();
}
// DFS 함수: 현재 노드에서 인접한 노드들을 순회하며 부모 노드를 기록
private static void dfs(ArrayList<Integer>[] tree, int[] parent, int current, int prev) {
for (int child : tree[current]) { // 현재 노드에서 인접한 노드들을 순회
if (child != prev) { // 이전 노드가 아닌 경우
parent[child] = current; // 현재 노드를 인접 노드의 부모로 기록
dfs(tree, parent, child, current); // 인접 노드를 시작점으로 DFS 재귀 호출
}
}
}
}
'Coding > Backjoon' 카테고리의 다른 글
[ Backjoon - 1463번 ] 1로 만들기 ( java ) (1) | 2024.01.30 |
---|---|
[ Backjoon - 1270번 ] 전쟁 땅따먹기 ( java ) (1) | 2024.01.30 |
[ Backjoon - 5613번 ] 계산기 프로그램 ( java ) (1) | 2023.12.26 |
[ Backjoon - 1158번 ] 요스푸스 문제 ( java ) (0) | 2023.12.16 |
[ Backjoon - 10818번 ] 최소, 최대 ( java ) (0) | 2023.11.17 |