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);
}
}
}
}