acmicpc

[BAEKJOON] 1068. 트리

코드와이 2021. 7. 1. 15:39

 

문제링크

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

 

1068번: 트리

첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다

www.acmicpc.net

 

package acmicpc.Gold5;

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

public class 트리 {

	static int n, x, root;
	static boolean check[];
	static List<Node> list;
	static class Node {
		int parentNode;		// 부모 노드
		int cnt;			// 자식 노드 개수
		public Node(int parentNode, int cnt) {
			super();
			this.parentNode = parentNode;
			this.cnt = cnt;
		}
	}
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		n = Integer.parseInt(br.readLine());
		check = new boolean[n];
		list = new ArrayList<>();
		for(int i = 0 ; i < n;  i++) {
			list.add(new Node(i,0));
		}
		
		root = -1;
		st = new StringTokenizer(br.readLine());
		for(int i = 0 ; i < n ; i++) {
			int parent = Integer.parseInt(st.nextToken());
			
			if(parent == -1) {
				root = i;
				list.get(i).parentNode = parent;
			} else {
				list.get(i).parentNode = parent;
				list.get(parent == -1 ? root : parent).cnt++;
			}
		}
		
		x = Integer.parseInt(br.readLine());
		check[x] = true;
		
		if(list.get(x).parentNode == -1) System.out.println(0);
		else {
			go(x);
	
			int ans = 0;
			for(int i = 0 ; i < n ; i++) {
				if(!check[i] && list.get(i).cnt == 0) ans++;
			}
			System.out.println(ans);
		}
	}
	
	public static void go(int idx) {
		check[idx] = true;
		list.get(list.get(idx).parentNode).cnt--;
		
		for(int i = 0 ; i < n ; i++) {
			if(i == idx) continue;
			if(list.get(i).parentNode == idx) {
				go(i);
			}
		}
	}
}