Algorithm/백준

[BOJ] 11725: 트리의 부모 찾기(JAVA)

류진주 2021. 10. 21. 12:20

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

 

11725번: 트리의 부모 찾기

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

www.acmicpc.net

루트 없는 트리가 주어진다. 이때, 트리의 루트를 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

 


[문제 풀이]

트리를 구현하여 해결하려 했는데 ArrayList<>[]를 이용하면 더 효율적임을 알게 되었다.

그 후 DFS로 부모 노드를 찾으면 된다.

우선 노드1에 연결된 모든 노드를 list[노드1]의 arraylist에 넣어준다.

만약 입력을 1 3으로 받았다면 list[1].add(3), list[3].add(1) 모두를 해주어야 한다.

누가 부모노드인지 아직 알 수 없기 때문에 연결된 모든 노드를 저장해준다.

위의 과정이 모든 입력에 대해 이루어졌으면 dfs를 이용해 부모 노드를 찾는다.

boolean 배열 check는 해당 노드를 방문했는지 여부를 나타낼 것이다.

우선 1번 노드부터 방문한다.

check[1]=true로 변경해주고, list[1]의 arraylist의 모든 노드를 확인한다.

만약 list[1]의 arraylist의 원소의 check값이 false면 1번 노드를 방문했지만, 해당 노드는 아직 방문하지 않은 것이므로 1번 노드의 자식 노드가 됨을 알 수 있다. 

정수 배열 parents에 각 인덱스에 해당하는 번호의 노드의 부모를 저장할 것이다. 즉, parents[2]에는 2번 노드의 부모 노드 번호가 저장될 것이다.

다시 위의 예시로 돌아가보면, check[i]가 false이면 parents[i] = v가 되고, 다시 dfs(i)를 호출하여 탐색하면 된다.

parents를 모두 찾았다면 2번 노드의 부모부터 출력하면 된다.

 

[코드]

import java.util.*;

public class Main{
   static ArrayList<Integer>[] list;
   static int[] parents;   
   static boolean[] check;
   static void dfs(int v) {
     check[v]=true;
     for(int node : list[v]) {
       if(!check[node]) {
          parents[node] = v;
          dfs(node);
       }
     }
   }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
    
       int N = sc.nextInt(); //노드 개수
       parents=new int[N+1];
       check = new boolean[N+1];
       list = new ArrayList[N+1];
    
       for(int i=1;i<=N;i++)
         list[i] = new ArrayList<Integer>();
   
       for(int i=1;i<N;i++) {
          int node1 = sc.nextInt();
          int node2 = sc.nextInt();
    
         list[node1].add(node2);
         list[node2].add(node1);
      }
       dfs(1);
       for(int i=2;i<=N;i++)
          System.out.println(parents[i]);
    }
    

}

'Algorithm > 백준' 카테고리의 다른 글

[BOJ] 14425: 문자열 집합(JAVA)  (0) 2021.10.25
[BOJ] 1967: 트리의 지름(JAVA)  (0) 2021.10.22
[BOJ] 1904: 01타일(JAVA)  (0) 2021.10.20
[BOJ] 2156: 포도주 시식(JAVA)  (0) 2021.10.18
[BOJ] 10816: 숫자 카드 2(JAVA)  (0) 2021.10.15