https://www.acmicpc.net/problem/12852
๐ ์๋ฐ(Java)๋ก ํธ๋ 1๋ก ๋ง๋ค๊ธฐ 2 - ๋ฐฑ์ค 12852 ๐ข
์ต์ ์ฐ์ฐ ํ์ + ๊ฒฝ๋ก ์ถ์ ๊น์ง ํ๋ DP ๋ฌธ์ !
๐ ๋ฌธ์ ๊ฐ์
๋ฐฑ์ค 12852๋ฒ - 1๋ก ๋ง๋ค๊ธฐ 2 ๋ฌธ์ ๋
์ ์ N์ด ์ฃผ์ด์ก์ ๋,
1๋ก ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ์ฐ์ฐ์ ๋ค์ ์ธ ๊ฐ์ง์ ๋๋ค:
- X → X / 3 (3์ผ๋ก ๋๋์ด๋จ์ด์ง ๋๋ง)
- X → X / 2 (2๋ก ๋๋์ด๋จ์ด์ง ๋๋ง)
- X → X - 1
์ต์ ์ฐ์ฐ ํ์๋ฅผ ์ถ๋ ฅํ๊ณ
๊ทธ ๊ฒฝ๋ก์ ํด๋นํ๋ ์ซ์ ์์๋ ์ถ๋ ฅํด์ผ ํฉ๋๋ค.
๐ก ์์ ์ ๋ ฅ
10
๐ก ์์ ์ถ๋ ฅ
3
10 9 3 1
๐ ์๊ณ ๋ฆฌ์ฆ ์ ๊ทผ ๋ฐฉ์: Dynamic Programming (DP)
โ๏ธ ํต์ฌ ์ ๋ต
- dp[i]: i๋ฅผ 1๋ก ๋ง๋ค๊ธฐ ์ํ ์ต์ ์ฐ์ฐ ํ์
- check[i]: i์ ์ค๊ธฐ ์ง์ ์ ์ (๊ฒฝ๋ก ์ถ์ ์ฉ)
๐น Java ์ฝ๋ ์ค๋ช
๐ ๊ธฐ๋ณธ ์ด๊ธฐํ
dp[1] = 0;
โ 1์ ์ด๋ฏธ ๋ชฉํ๊ฐ์ด๋ฏ๋ก ์ฐ์ฐ ํ์ 0
๐ ๋ฐ๋ณต๋ฌธ์ผ๋ก dp ์ฑ์ฐ๊ธฐ
for (int i = 2; i <= N; i++) {
dp[i] = dp[i - 1] + 1;
check[i] = i - 1;
if (i % 3 == 0 && dp[i / 3] + 1 < dp[i]) {
dp[i] = dp[i / 3] + 1;
check[i] = i / 3;
}
if (i % 2 == 0 && dp[i / 2] + 1 < dp[i]) {
dp[i] = dp[i / 2] + 1;
check[i] = i / 2;
}
}
โ ํ์ฌ ์ i๋
- i-1
- i/2
- i/3โ check[i]๋ฅผ ํตํด ์ต๋จ ๊ฒฝ๋ก์ ์ด์ ์ ์ ์ฅ
- ์ค ์ต์ ์ฐ์ฐ ๊ฒฝ๋ก๋ฅผ ์ ํ
๐ ๊ฒฝ๋ก ์ถ์
sb.append(dp[N]).append("\n").append(N).append(" ");
while (N > 1) {
sb.append(check[N]).append(" ");
N = check[N];
}
โ dp๊ฐ์ ์ถ๋ ฅํ๊ณ
โ check[] ๋ฐฐ์ด์ ๋ฐ๋ผ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ๊ฒฝ๋ก๋ฅผ ์ฌ๊ตฌ์ฑ
๐ ์ ๋ฆฌ
โ ํต์ฌ ํฌ์ธํธ
- DP[i] = min(DP[i-1], DP[i/2], DP[i/3]) + 1
- check[i] ๋ฐฐ์ด์ ํตํด ๊ฒฝ๋ก ์ถ์ ๊น์ง ๊ฐ๋ฅ
- ๊ฒฝ๋ก ์ถ๋ ฅ์ด ์ถ๊ฐ๋ 1๋ก ๋ง๋ค๊ธฐ ํ์ฅํ
์ด ๊ธ์ด ๋์์ด ๋์ จ๋ค๋ฉด ์ข์์์ ๊ณต์ ๋ถํ๋๋ฆฝ๋๋ค! ๐
'Algorithm & Data Structures > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
b14003. ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด 5 (0) | 2025.04.16 |
---|---|
b14002. ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด 4 (0) | 2025.04.15 |
b1450. ๋ ์๋ฌธ์ (1) | 2025.04.10 |
b3665. ์ต์ข ์์ (0) | 2025.04.09 |
b.2696 ์ค์๊ฐ ๊ตฌํ๊ธฐ (0) | 2025.04.07 |