[JavaScript] ๋ฐฑ์ค 13549๋ฒ - ์จ๋ฐ๊ผญ์ง 3
[๋ฌธ์ ]
[ํ์ด]
์๋น์ด๊ฐ ๋์์ ์ฐพ์์ ์ด๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ 2๊ฐ์ง๊ฐ ์์ต๋๋ค.
- 1์ด ๋์ -1 ์นธ or +1 ์นธ ์ด๋
- 0์ด ๋์ ์๊ฐ์ด๋ํ์ฌ X2์นธ ์ด๋
๋ฐ๋ผ์ ๊ท์น์ ์ผ๋ก ์ด๋ํ๋ ๊ฒ์ ๋ณด๊ณ DP๋ฅผ ํ์ฉํ์ฌ ํ์ดํ์์ต๋๋ค.
1. ์๋น์ด ์์น N๋ณด๋ค ์์ ์นธ์ผ๋ก๋ ์๊ฐ์ด๋์ด ๋ถ๊ฐ๋ฅํด์ ํญ์ 1์ด๊ฐ ๊ฑธ๋ ค -1์นธ์ฉ ์ด๋ํด์ผํฉ๋๋ค.
- N๋ณด๋ค ์์ ์์น๋ 0์์ 1์ด์ฉ ์๊ฐ์ ์ฆ๊ฐ์์ผ ๊ฐ dp ๋ฐฐ์ด์ ์์น ์ธ๋ฑ์ค์ ์๊ฐ์ ์ ์ฅ
2. ์๋น์ด ์์น N์ 0์ด๋ก ์์ํด์ N๋ณด๋ค ํฐ ์นธ์ผ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ๋ ๊ฑท๊ธฐ์ ์๊ฐ์ด๋ 2๊ฐ์ง๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ํ์ฌ ์์น๋ฅผ X๋ผ๊ณ ํ์๋, X์์น๋ก ์ด๋ํ ์ ์๋ ๊ฒฝ์ฐ๋ 2๊ฐ์ง๊ฐ ์์ต๋๋ค.
- X-1์์ +1์นธ ๊ฑธ์ด์จ ๊ฒฝ์ฐ : 1์ด์ ์๊ฐ์ด ๊ฑธ๋ฆผ => dp[X-1] + 1
- X/2 ์นธ์์ ์๊ฐ์ด๋ํ ๊ฒฝ์ฐ : 0์ด์ ์๊ฐ์ด ๊ฑธ๋ฆผ => dp[X/2] (X์ ๊ฐ์ด ์ง์์ธ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅ!!)
๋ฐ๋ผ์ 2๋ฒ์ ๊ฒฝ์ฐ ์ ํ์์ ์ธ์ฐ๋ฉด dp๋ dp[X-1] + 1 ์ dp[X/2] ์ค ๋ ์์ ๊ฐ์ด ๋ฉ๋๋ค.
3. dp[X/2]๋ก X์ ์์น๊ฐ ๊ฐฑ์ ๋๋ฉด, X๋ณด๋ค ์์ ๊ฐ๋ค๋ ๋ค์ ๊ฐฑ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
- dp[X/2]๊ฐ ์ ํ๋ ๊ฒฝ์ฐ, X๋ถํฐ X/2๊น์ง -1์นธ์ฉ ๋ด๋ ค๊ฐ๋ฉฐ "dp[X/2] + ๋ด๋ ค๊ฐ ์นธ์"๊ฐ ํด๋น ์นธ์ dp๊ฐ๋ณด๋ค ์๋ค๋ฉด ๊ฐฑ์
์ต์ข ์ ์ผ๋ก dp[K]์ ๊ฐ์ ์ถ๋ ฅํด์ค๋๋ค.
*์ฒ์์ dp๋ฅผ K๊น์ง ๊ตฌํด์ฃผ์๋๋ฐ, K๋ณด๋ค ํฐ์์์ -1์นธ์ฉ ๋ด๋ ค์จ ๊ฒฝ์ฐ์์ ์ต์๊ฐ์ด ๊ตฌํด์ง ์๋ ์๋ค๋ ๊ฒ์ ์๊ณ ๋ฒ์๋ฅผ K+N์ผ๋ก ํ์ฅ์์ผ์ฃผ์์ต๋๋ค.
์์ 1๋ฒ์ ์ดํด๋ณด์๋ฉด N=5์ด๊ณ K=17์ผ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. 0~5 ๊น์ง ๊ตฌํ๊ธฐ
dp = [5,4,3,2,1,0]
2. 6~22 ๊น์ง ๊ตฌํ๊ธฐ
dp[6] = dp[5] + 1 = 1 (dp[3]์ ๊ฐ์ 2์ด๊ธฐ ๋๋ฌธ์ 1๋ก ๊ฐฑ์ )
dp[7] = dp[6] + 1 = 2 (ํ์์ด๋๊น ์ ์นธ + 1)
dp[8] = dp[4] = 1 (dp[7] + 1 = 3์ผ๋ก 1๋ณด๋ค ํผ)
...
์ด๋ฐ์์ผ๋ก ๊ตฌํด๋๊ฐ๋ฉด dp[K] = 2 ๋ฅผ ๊ตฌํ ์ ์์ต๋๋ค.
[์ฝ๋]
const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().split('\n');
const [N, K] = input[0].split(" ").map(Number);
const len = K + N;
let dp = Array.from({length: len}, (_, i) => -1);
for(let i=0;i<=N;i++) {
dp[i] = N-i;
}
for(let i=N+1;i<=len;i++) {
const num = dp[i-1] + 1;
const divNum = i/2;
if(divNum >= 0 && i % 2 == 0 && dp[divNum] < num) {
dp[i] = dp[divNum];
// ๋ฐ์ ์ ๋ค๋ ๊ฐฑ์
for(let j=i-1;j>=divNum;j--) {
if(dp[j+1] + 1 < dp[j]) {
dp[j] = dp[j+1] + 1;
} else {
break;
}
}
} else {
dp[i] = num;
}
}
console.log(dp[K]);