코테/백준
[백준/JAVA] 11725번: 트리의 부모 찾기
imname1am
2023. 5. 6. 23:58
반응형
🔺 문제
11725번: 트리의 부모 찾기
루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
www.acmicpc.net
🔺 코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
import java.util.*;
import java.io.*;
public class Main {
static int N;
static ArrayList<Integer> tree[]; // 인접 리스트
static boolean visited[]; // 방문 배열
static int answer[]; // 부모 노드 배열
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
visited = new boolean[N + 1];
answer = new int[N + 1];
// 인접 리스트 초기화
tree = new ArrayList[N + 1];
for(int i = 0 ; i < tree.length ; i++) {
tree[i] = new ArrayList<>();
}
// 양방향 인접 리스트 채우기
for(int i = 1 ; i < N ; i++) {
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
tree[a].add(b);
tree[b].add(a);
}
DFS(1); // 부모 노드부터 DFS 시작
StringBuilder sb = new StringBuilder();
for(int i = 2 ; i <= N ; i++) {
sb.append(answer[i] + "\n");
}
}
public static void DFS(int num) {
visited[num] = true;
for(int i : tree[num]) {
if(!visited[i]) {
answer[i] = num; // ⭐ DFS 탐색하면서 부모 노드를 정답 배열에 저장
DFS(i);
}
}
}
}
|
cs |
✅ 해결 아이디어
✔ DFS / BFS
- DFS 탐색하면서 부모 노드를 정답 배열에 저장 (45번째 줄 :answer[i] = num
)
🔺 다른 풀이들
- BFS 활용한 방법도 확인
[백준] 11725 : 트리의 부모 찾기 - Java
https://www.acmicpc.net/problem/11725 문제 루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.
velog.io
백준/11725번 :: 트리의 부모찾기 (java 자바) - DFS, BFS 이용
문제 루트 없는 트리가 주어진다. 이 때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄
hongku.tistory.com
💬 느낀 점
트리는 그래프 구현 방식을 이용할 수 있고,
탐색 역시 그래프 알고리즘을 사용할 수 있다! 는 점을 잊지 말자
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 230628 | 240103 | 240616 |
(+ 230628 2회독)
BFS 를 썼다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
import java.util.*;
import java.io.*;
public class Main {
static int N;
static ArrayList<Integer>[] tree;
static boolean[] visited;
static int[] parent; // 📍 부모 노드 배열 📍
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
tree = new ArrayList[N + 1];
for(int i = 1 ; i <= N ; i++) {
tree[i] = new ArrayList<>();
}
visited = new boolean[N + 1];
parent = new int[N + 1];
for(int i = 1 ; i <= N - 1 ; i++) {
st = new StringTokenizer(br.readLine(), " ");
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
tree[s].add(e);
tree[e].add(s);
}
bfs(1);
// 2번 노드부터 부모 노드 출력하기
for(int i = 2 ; i <= N ; i++) {
sb.append(parent[i]).append("\n");
}
System.out.println(sb);
}
private static void bfs(int num) {
Queue<Integer> queue = new LinkedList<>();
queue.add(num);
visited[num] = true;
while(!queue.isEmpty()) {
int now = queue.poll();
for(int next : tree[now]) {
if(!visited[next]) {
visited[next] = true;
parent[next] = now; // 🔔 탐색하면서 부모 노드를 정답 배열에 저장! 🔔
queue.add(next);
}
}
}
}
}
|
cs |
(참고)
✔ Do it 알고리즘 코딩테스트 자바편
반응형