본문 바로가기

OJ

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

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

 

11725번: 트리의 부모 찾기

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

www.acmicpc.net

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringBuilder sb = new StringBuilder();
	static StringTokenizer st;
	static int N;
	static int[] parent;
	
	public static void main(String[] args) throws IOException {
		
		N = Integer.parseInt(br.readLine());	// 정점 수
		parent = new int[N + 1];
		parent[1] = 1;
		
		for (int i = 1; i < N; i++) {
			
			st = new StringTokenizer(br.readLine(), " ");
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			
			if(parent[a] != 0 && parent[b] != 0) {
				if(one(b)) {
					reverse(a);
					parent[a] = b;
				}else {
					reverse(b);
					parent[b] = a;
				}
			}
			else if(a == 1) parent[b] = a;
			else if(b == 1) parent[a] = b;
			else if(parent[a] != 0) parent[b] = a;
			else if(parent[b] != 0) parent[a] = b;
			else parent[b] = a;
			
		}
		
		for (int i = 2; i <= N; i++) sb.append(parent[i]).append("\n");
		
		System.out.println(sb);
		
	}
	
	// 조상 중 1이 있으면 true 반환
	static boolean one(int a) {
		
		if(parent[a] == 1) return true;
		else if(parent[a] == 0) return false;
		
		return one(parent[a]);
		
	}
	
	// n의 부모, 부모의 부모, ... 을 모두 n의 자식, 자식의 자식, ... 으로 바꿈
	static void reverse(int n) {
		
		int p = parent[n];
		
		if(parent[p] != 0) reverse(p);	
		
		parent[p] = n;
		
	}
	
}

'OJ' 카테고리의 다른 글

[BOJ] 1743 음식물 피하기 (JAVA)  (3) 2022.12.11
[BOJ] 1194 달이 차오른다, 가자. (JAVA)  (2) 2022.10.07
[SWEA] 1949 등산로 조성 (JAVA)  (0) 2022.08.27
[BOJ] 17070 파이프 옮기기 1 (JAVA)  (0) 2022.08.18
[SWEA] 4012 요리사 (JAVA)  (0) 2022.08.13