Tree 백준 알고리즘 자바 11725 ‘트의 부모 찾기’

1 minute read

Problem

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

Input 첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.

Output 첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.

Solution

List<>[] 리스트와 배열을 합해서 트리를 작성한다. 1이 루트노드이므로 1부터 dfs를 시작한다. bfs로 하는 사람들도 많았지만 dfs가 편하여 dfs로 하였다. 지금 노드와 연결되어 있는 노드들을 for문을 이용해 가져오고, 방문한적이 없으면 지금 노드가 부모 노드가 되고 연결되어 있는 노드가 자식 노드가 된다. (부모 노드를 자식 노드보다 항상 먼저 방문하기 때문이다.)

Code

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
	static int[] parents;
	static List<Integer>[] list;
	static boolean[] visit;
	static int n;
	
	private static void dfs(int v) {
		visit[v] = true;
		
		for(int i : list[v]) {
			if(!visit[i]) {
				parents[i] = v;
				dfs(i);
			}
		}
	}
	
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		n = scan.nextInt();
		
		list = new ArrayList[n+1]; parents = new int[n+1];
		for(int i = 1; i <= n; i++) list[i] = new ArrayList<>();
		
		visit = new boolean[n+1];
		for(int i = 0; i < n-1; i++) {
			int a = scan.nextInt(), b = scan.nextInt();
			list[a].add(b); list[b].add(a);
		}
		
		dfs(1);
		for(int i = 2; i <= n; i++) System.out.println(parents[i]);
	}
}

Tags:

Updated: