Algorithm/BOJ(Baekjoon Online Judge)
[백준 - 1068번] 트리 - Java //Wello Horld //
koucop
2020. 4. 2. 12:43
이번에는 BOJ의 1068번 문제 "트리" 를 풀어보도록 하자
성공한 코드는 다음과 같다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
ArrayList<Integer>[] listArr = (ArrayList<Integer>[]) new ArrayList[N];
boolean[] chk = new boolean[N];
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
listArr[i] = new ArrayList<Integer>();
}
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int root = 0;
for (int i = 0; i < N; i++) {
if (arr[i] == -1) {
root = i;
continue;
}
listArr[arr[i]].add(i);
listArr[i].add(arr[i]);
}
int remove = Integer.parseInt(br.readLine());
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(remove);
chk[remove] = true;
while (!queue.isEmpty()) {
remove = queue.poll();
for (int a : listArr[remove]) {
if (!chk[a] && arr[remove] != a) {
queue.add(a);
chk[a] = true;
}
}
}
int cnt = 0;
if (!chk[root]) {
queue.add(root);
chk[root] = true;
while (!queue.isEmpty()) {
int node = queue.poll();
boolean flag = false;
for (int a : listArr[node]) {
if (!chk[a] && arr[node] != a) {
flag = true;
queue.add(a);
chk[a] = true;
}
}
if (!flag) {
cnt++;
}
}
}
bw.write(cnt + "\n");
bw.flush();
br.close();
bw.close();
}
}
문제 : https://www.acmicpc.net/problem/1068
1068번: 트리
첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다. 셋째 줄에는 지울 노드의 번호가 주어진다.
www.acmicpc.net
혹시 코드에 이상한 부분이나 틀린 부분이 있던지, 이해가 안가는 부분이 있다면 댓글로 알려주세요