https://www.acmicpc.net/problem/1068
1. 입력을 처리할 때, 각 노드의 부모 노드를 기억, 노드의 자식 노드들을 기억할 수 있도록 데이터를 저장하는 자료구조를 사용한다.
2. 제거해야하는 노드가 있으면, 부모 노드의 자식 노드에서 해당 노드를 지우고, 제거해야하는 노드와 연결된 노드들을 큐를 사용해 모두 체크한다.
3. 전체 노드들을 탐색하면서, 자식 노드가 0이며 제거햐아하는 노드와 연결되지 않은 것을 정답의 값에 추가한다.
해설코드(Java).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
import java.util.*;
import java.lang.*;
import java.io.*;
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.valueOf(br.readLine());
String[] sArr = br.readLine().split(" ");
int K = Integer.valueOf(br.readLine());
boolean[] removeChk = new boolean[N];
Arrays.fill(removeChk, false);
int[] pArr = new int[N];
ArrayList<HashSet<Integer>> cList = new ArrayList<>();
for(int i = 0; i < sArr.length; i++)
cList.add(new HashSet<Integer>());
for(int i = 0; i < sArr.length; i++){
int parent = Integer.valueOf(sArr[i]);
pArr[i] = parent;
if(parent != -1)
cList.get(parent).add(i);
}
int parent = pArr[K];
if(parent == -1){
bw.write("0" + "\n");
bw.flush();
return;
}
cList.get(parent).remove(K);
Queue<Integer> q = new LinkedList<>();
q.offer(K);
removeChk[K] = true;
while(!q.isEmpty()){
for(int i : cList.get(q.poll())){
q.offer(i);
removeChk[i] = true;
}
}
int answer = 0;
int idx = 0;
for(HashSet<Integer> hs : cList){
if(hs.size() == 0 && !removeChk[idx])
answer += 1;
idx += 1;
}
bw.write(answer + "\n");
bw.flush();
}
}
|
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ 12865] 평범한 배낭(Java, DP) (0) | 2020.08.20 |
---|---|
[BOJ 1024] 수열의 합(Java, 단순한 풀이) (0) | 2020.08.19 |
[BOJ 1405] 미친 로봇(Java, DFS, 간단한 풀이) (0) | 2020.08.18 |
[BOJ 2616] 소형기관차(Java, Dynamic Programming, 동적계획법, Bottom-up, Top-down 풀이) (0) | 2020.08.16 |
[BOJ 1933] 스카이라인(Java, Treemap, 설명, 간단한 코드) (0) | 2020.08.12 |