Algorithm/Baekjoon

[JavaScript] ๋ฐฑ์ค€ 13549๋ฒˆ - ์ˆจ๋ฐ”๊ผญ์งˆ 3

๊ฐœ๋ฐœ๊ฐœ๊ตด๐Ÿธ 2022. 8. 5. 00:17

[๋ฌธ์ œ]

[ํ’€์ด]

์ˆ˜๋นˆ์ด๊ฐ€ ๋™์ƒ์„ ์ฐพ์•„์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ 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]);