Algorithm & Data Structures/BOJ
b1068. ํธ๋ฆฌ
Geisha
2025. 5. 31. 21:00
https://www.acmicpc.net/problem/1068
๐ฒ ์๋ฐ๋ก ํธ๋ ํธ๋ฆฌ ๋ฌธ์ ํ์ด (๋ฐฑ์ค 1068 - ํธ๋ฆฌ)
๐ ๋ฌธ์ ๊ฐ์
- N๊ฐ์ ๋ ธ๋๋ก ์ด๋ฃจ์ด์ง ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ง
- ๋ ธ๋ ์ค ํ๋๋ฅผ ์ญ์ ํ์ ๋, ๋จ์ ํธ๋ฆฌ์ ๋ฆฌํ ๋ ธ๋ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
์ ์ฝ ์กฐ๊ฑด
- ํธ๋ฆฌ์ ๋ ธ๋๋ 0๋ฒ๋ถํฐ N-1๋ฒ๊น์ง
- ๋ฃจํธ๋ ๋ถ๋ชจ๊ฐ -1์ธ ๋ ธ๋
- ์ญ์ ์ ํด๋น ๋ ธ๋์ ๊ทธ ํ์ ๋ ธ๋ ์ ๋ถ ์ ๊ฑฐ
๐ก ์์ ์ ๋ ฅ
5
-1 0 0 1 1
2
→ ๋ ธ๋ 2๋ฒ์ ์ง์ฐ๋ฉด, ๋จ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค:
0
/ \
1 (X)
/ \
3 4
→ ๋ฆฌํ ๋ ธ๋๋ 3, 4 → 2๊ฐ
์์ ์ถ๋ ฅ
2
๐ง ์๊ณ ๋ฆฌ์ฆ ์ ๊ทผ ๋ฐฉ์
- ์
๋ ฅ ๋ฐฐ์ด์ ๊ธฐ๋ฐ์ผ๋ก ํธ๋ฆฌ ๊ตฌ์กฐ ์์ฑ
- tree[i] = [์์1, ์์2, ...]
- ์ญ์ ํ ๋ ธ๋๊ฐ ๋ฃจํธ๋ฉด → ๋ฆฌํ ๋ ธ๋ 0๊ฐ
- ๋ฃจํธ๋ถํฐ DFS ์ํ
- ์์์ด ์๊ฑฐ๋ ์ญ์ ๋ ์์๋ง ์์ผ๋ฉด ๋ฆฌํ ๋ ธ๋๋ก ๊ฐ์ฃผ
๐ ์ ์ฒด ์ฝ๋ (DFS ๊ธฐ๋ฐ)
import java.util.*;
public class Main {
static List<Integer>[] tree;
static int deleteNode, leafCount = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] parent = new int[N];
tree = new ArrayList[N];
int root = -1;
for (int i = 0; i < N; i++) tree[i] = new ArrayList<>();
for (int i = 0; i < N; i++) {
parent[i] = sc.nextInt();
if (parent[i] == -1) root = i;
else tree[parent[i]].add(i);
}
deleteNode = sc.nextInt();
if (deleteNode == root) System.out.println(0);
else {
dfs(root);
System.out.println(leafCount);
}
}
static void dfs(int now) {
if (now == deleteNode) return;
int childCount = 0;
for (int child : tree[now]) {
if (child != deleteNode) {
dfs(child);
childCount++;
}
}
if (childCount == 0) leafCount++;
}
}
๐ ์ฝ๋ ํด์ค
๊ตฌ๋ฌธ | ์ค๋ช |
tree[parent[i]].add(i) | ํธ๋ฆฌ๋ฅผ ์์ ๊ธฐ์ค์ผ๋ก ๊ตฌ์ฑ |
if (deleteNode == root) | ๋ฃจํธ๊ฐ ์ง์์ง๋ฉด ํธ๋ฆฌ ์์ฒด๊ฐ ์ฌ๋ผ์ง |
dfs(now) | ์ญ์ ๋ ธ๋๋ฅผ ๋ง๋๋ฉด ๋ฐ๋ก ๋ฆฌํด |
if (childCount == 0) | ๋ ์ด์ ๊ฐ ์์์ด ์๋ค๋ฉด ๋ฆฌํ ๋ ธ๋ |
โ ํต์ฌ ํฌ์ธํธ ์ ๋ฆฌ
- ํธ๋ฆฌ๋ ์ฐ๊ฒฐ ์ ๋ณด๊ฐ ๋ช ์์ ์ผ๋ก ์ฃผ์ด์ง์ง ์์ → ๋ถ๋ชจ ๋ฐฐ์ด ๊ธฐ๋ฐ์ผ๋ก ์์ ๋ฆฌ์คํธ ์์ฑ
- ์ญ์ ๋๋ ๋ ธ๋๊ฐ ๋ฃจํธ์ผ ๊ฒฝ์ฐ ์ฃผ์!
- DFS ์ค ์ญ์ ๋์ ๋ ธ๋๋ ๋ฐฉ๋ฌธํ์ง ์์