Algorithm/BFS & DFS
[๋ฐฑ์ค, Java] 1068๋ฒ : ํธ๋ฆฌ
Zayson
2022. 5. 8. 15:54
๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1068
๐ฎ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
Map์ ์ด์ฉํด ๊ตฌํ์ ํ์ํ ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์ค ํ DFS๋ฅผ ์ด์ฉํด ๋ฃจํธ ๋ ธ๋๋ถํฐ ํ์ํ๋ค.
- Map์์ ํ์ฌ ๋ ธ๋์ ํด๋นํ๋ ๋ฆฌ์คํธ๊ฐ ์๋ ๊ฒฝ์ฐ๋ ๋จ๋ง ๋ ธ๋์ด๊ธฐ ๋๋ฌธ์ ๋จ๋ง ๋ ธ๋ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
- ํ์ฌ ๋ ธ๋๊ฐ ์ญ์ ํ ๋ ธ๋์ธ ๊ฒฝ์ฐ๋ ๋ค์ ๋ ธ๋๋ค์ ๋ชจ๋ ์ญ์ ๋๋ฏ๋ก ๊ทธ๋๋ก returnํ๋ค.
- ๋ง์ฝ ํ์ฌ ๋ ธ๋์์ ์ฐ๊ฒฐ๋ ์์ ๋ ธ๋๊ฐ ์ญ์ ๋๋ ๋ ธ๋์ด๋ฉด์ ๋จ๋ง ๋ ธ๋์ธ ๊ฒฝ์ฐ๋ ์ญ์ ํ ํ์ฌ ๋ ธ๋๊ฐ ๋จ๋ง๋ ธ๋๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋จ๋ง ๋ ธ๋ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
๐ฉ Java ์ฝ๋
package com.algorithm.Baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main_1068_ํธ๋ฆฌ {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Map<Integer, List<Integer>> tree = new HashMap<>();
// ํธ๋ฆฌ ์ด๊ธฐํ
for (int node = 0; node < N; node++) {
tree.put(node, new LinkedList<>());
}
StringTokenizer st = new StringTokenizer(br.readLine());
int rootNode = 0;
// ํธ๋ฆฌ ์ฐ๊ฒฐ
for (int node = 0; node < N; node++) {
int parent = Integer.parseInt(st.nextToken());
if (parent != -1) {
tree.get(parent).add(node);
} else {
rootNode = node;
}
}
// ์ ๊ฑฐํ ๋
ธ๋
int removeNode = Integer.parseInt(br.readLine());
leaf = 0;
getLeafNode(rootNode, removeNode, tree);
System.out.println(leaf);
br.close();
}
private static int leaf;
private static void getLeafNode(int start, int remove, Map<Integer, List<Integer>> tree) {
// ์ญ์ ํ ๋
ธ๋ ๋๋ฌ ์ ์ดํ๋ DFS ์ํจ
if (start == remove) {
return;
}
// ์ฐ๊ฒฐ๋ ๋
ธ๋๊ฐ ์์ผ๋ฉด ๋ฆฌํ๋
ธ๋
if (tree.get(start).size() < 1) {
leaf++;
return;
}
// ์ฐ๊ฒฐ๋ ๋
ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ๋ฐ ์์ ๋
ธ๋ ๋ฐฉ๋ฌธ
for (int next : tree.get(start)) {
// ์ฐ๊ฒฐ๋ ์์ ๋
ธ๋๊ฐ ์ญ์ ํ ๋
ธ๋์ด๊ณ , ์ฐ๊ฒฐ๋ ๋
ธ๋๊ฐ ํ๊ฐ์ธ ๊ฒฝ์ฐ -> ์์ ๋
ธ๋๊ฐ ๋จ๋ง ๋
ธ๋์ธ ๊ฒฝ์ฐ
if(next == remove && tree.get(start).size() == 1) {
leaf++;
}
getLeafNode(next, remove, tree);
}
}
}
๋ฐ์ํ