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 |