코테/백준

[백준/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 알고리즘 코딩테스트 자바편

 

반응형