https://www.acmicpc.net/problem/1068
1068번: 트리
첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다
www.acmicpc.net
풀이
1. 이중 리스트에 자식 노드 넣기
2. 루트 노드에서 시작해 리프 노드 세기
3. DFS 순회하며 다음 순회할 노드가 잘린 노드면 건너뛰기
코드
public class Pro1068 {
static List<List<Integer>> a = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n, c ,del,root = 0;
StringTokenizer st = new StringTokenizer(bf.readLine());
n = Integer.parseInt(st.nextToken());
for(int i=0;i<n;i++) {
a.add(new ArrayList<>());
}
st = new StringTokenizer(bf.readLine());
for(int i=0;i<n;i++) {
int tmp = Integer.parseInt(st.nextToken());
if(tmp == -1)root = i;
if(tmp != -1)a.get(tmp).add(i);
}
st = new StringTokenizer(bf.readLine());
del = Integer.parseInt(st.nextToken());
if(del == root)System.out.println(0);
else System.out.println(dfs(root, del));
}
static int dfs(int here, int del) {
int ret = 0;
int child = 0;
for(int there : a.get(here)) {
if(there == del)continue;
ret += dfs(there, del);
child ++;
}
if(child==0)return 1;
else return ret;
}
}