๋ฌธ์
https://www.acmicpc.net/problem/2533
๋ฌธ์ ์ดํด
- SNS ๋คํธ์ํฌ๋ ํธ๋ฆฌ(์ฌ์ดํด ์์) ๋ก ์ฃผ์ด์ง๋ค.
- ์ด๋ค ์ฌ๋์ด ์ ๋ณด๋ฅผ ์ ๋ฌ๋ฐ์ผ๋ ค๋ฉด ๊ทธ ์ฌ๋์ ์ด์ ์ค ์ ์ด๋ ํ ๋ช ์ ‘์ผ๋ฆฌ์ด๋ตํฐ’ ์ฌ์ผ ํ๋ค.
- ๋ชจ๋ ์ฌ๋์ด ์ ๋ณด๋ฅผ ์ ๋ฌ๋ฐ๋๋ก ํ ๋, ํ์ํ ์ผ๋ฆฌ์ด๋ตํฐ์ ์ต์ ์๋ฅผ ๊ตฌํ๋ค.
TIP: “๋ชจ๋ ๊ฐ์ ๋ง๋ค ์ ๋์ ์ค ์ต์ ํ ์ชฝ์ ์ ํ๋์ด์ผ ํจ” ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์ฝ๋ค.
ํ์ด ์์ด๋์ด: ํธ๋ฆฌ DP
๋ฃจํธ๋ฅผ 1๋ก ์ก๊ณ DFS๋ก ํธ๋ฆฌ๋ฅผ ๋ด๋ ค๊ฐ๋ฉฐ ํ์ํ๋ค.
์ํ ์ ์
dp[0][node]:node๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ๊ฐ ์๋ ๋,node์ ์๋ธํธ๋ฆฌ์์ ํ์ํ ์ต์ ์ผ๋ฆฌ์ด๋ตํฐ ์dp[1][node]:node๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ์ผ ๋,node์ ์๋ธํธ๋ฆฌ์์ ํ์ํ ์ต์ ์ผ๋ฆฌ์ด๋ตํฐ ์
์ ํ์
ํ์ฌ ์ ์ ์ cur, ์์ ์ ์ ์ child๋ผ ํ ๋, ๋ชจ๋ ๊ฐ์ (cur, child) ์์ ์ต์ ํ ์ชฝ์ ์ผ๋ฆฌ์ด๋ตํฐ๋ก ์ ํ๋์ด์ผ ํ๋ค.
cur๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ๊ฐ ์๋ ๊ฒฝ์ฐ
→child๋ ๋ฐ๋์ ์ผ๋ฆฌ์ด๋ตํฐ์ฌ์ผ ํ๋ค.
dp[0][cur] = Σ dp[1][child]
(Σ : ๊ฐ ์์ ์๋ธํธ๋ฆฌ์์ ์ป์ dp๊ฐ๋ค์ ๋ํ๋ค)
cur๊ฐ ์ผ๋ฆฌ์ด๋ตํฐ์ธ ๊ฒฝ์ฐ
→ ๊ฐ์(cur, child)๋ ์ด๋ฏธcur์ชฝ์์ ๋ง์กฑ.child๋ ์ผ๋ฆฌ์ด๋ตํฐ์ผ ์๋/์๋ ์๋ ์๋ค. ๋ ์์ ์ชฝ์ ์ ํํ๋ค.
dp[1][cur] = 1 + Σ min(dp[0][child], dp[1][child])
์ฌ๊ธฐ์ +1์ cur ์์ ์ด ์ผ๋ฆฌ์ด๋ตํฐ์ธ ๊ฒ์ ํฌํจํ๋ค.
DFS ํ์
dp[0][u] = 0,dp[1][u] = 1๋ก ๋๊ณ ์์๋ค์ ๋ฐ์ํด ๋์ ํ๋ค. ์ ๋ต์min(dp[0][1], dp[1][1])(๋ฃจํธ 1 ๊ธฐ์ค)- ํธ๋ฆฌ์ด๋ฏ๋ก
visited๋ก ๋ถ๋ชจ ์ฌ๋ฐฉ๋ฌธ์ ๋ง์์ค๋ค.
์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
static int n;
static List<Integer>[] graph;
static boolean[] visited;
static int[][] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
visited = new boolean[n + 1];
graph = new ArrayList[n + 1];
dp = new int[2][n + 1]; // [0]: ์ผ๋ฆฌ์ด๋ตํฐ X, [1]: ์ผ๋ฆฌ์ด๋ตํฐ O
for (int i = 0; i <= n; i++) {
graph[i] = new ArrayList<>();
}
for (int i = 0; i < n - 1; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
graph[u].add(v);
graph[v].add(u);
} // ์
๋ ฅ ๋
dfs(1);
System.out.println(Math.min(dp[0][1], dp[1][1]));
}
static void dfs(int cur) {
visited[cur] = true;
dp[0][cur] = 0;
dp[1][cur] = 1;
for (int child : graph[cur]) {
if (visited[child])
continue;
dfs(child);
dp[0][cur] += dp[1][child]; // ์์์ด ๋ฌด์กฐ๊ฑด ์ผ๋ฆฌ์ด๋ตํฐ
dp[1][cur] += Math.min(dp[0][child], dp[1][child]);
}
}
}
'๐ญ Problem Solving > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [BOJ][Java] 20056. ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด๋ณผ (0) | 2025.10.15 |
|---|---|
| [BOJ][Java] 16236. ์๊ธฐ ์์ด (0) | 2025.10.01 |
| [BOJ][Java] 15486. ํด์ฌ 2 (0) | 2025.09.15 |
| [BOJ][Java] 16930. ๋ฌ๋ฆฌ๊ธฐ (4) | 2025.09.09 |
| [BOJ][Java] 14503. ๋ก๋ด ์ฒญ์๊ธฐ (0) | 2025.09.03 |