๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œํ’€์ด

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค-42895] N์œผ๋กœ ํ‘œํ˜„

by alswlfl 2026. 4. 30.

[DP-N์œผ๋กœ ํ‘œํ˜„]

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก์˜ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

๋ฌธ์ œ ์„ค๋ช…

N๊ณผ ์‚ฌ์น™์—ฐ์‚ฐ๋งŒ์œผ๋กœ number๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ, N ์‚ฌ์šฉ ํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’ ๋ฆฌํ„ดํ•˜๊ธฐ

ex) N=5, number=12

12 = 5+5+(5/5)+(5/5)

12 = 55/5 + 5/5

12 = (55+5)/5 → 3

 

์ œํ•œ ์‚ฌํ•ญ

  • N์€ 1 ์ด์ƒ 9 ์ดํ•˜์ด๋‹ค.
  • number๋Š” 1 ์ด์ƒ 32,000 ์ดํ•˜์ด๋‹ค.
  • ์ˆ˜์‹์—๋Š” ๊ด„ํ˜ธ์™€ ์‚ฌ์น™์—ฐ์‚ฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋‚˜๋ˆ„๊ธฐ ์—ฐ์‚ฐ์—์„œ ๋‚˜๋จธ์ง€๋Š” ๋ฌด์‹œํ•œ๋‹ค.
  • ์ตœ์†Ÿ๊ฐ’์ด 8๋ณด๋‹ค ํฌ๋ฉด -1์„ return

 

๋ฌธ์ œ ์ ‘๊ทผ

DP ์œ ํ˜•์ด์–ด์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ N์˜ ์‚ฌ์šฉํšŸ์ˆ˜๋ฅผ ๋„ฃ์–ด์„œ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ ๊ณ ๋ฏผํ–ˆ์ง€๋งŒ, ๊ทœ์น™์ด ๋– ์˜ค๋ฅด์ง€ ์•Š์•„ ๋‹ค๋ฅธ ๋ถ„๋“ค์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.

DP ๊ทœ์น™์„ ์ž˜ ์ฐพ์•„์•ผ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™๋‹ค.. DP[N์˜ ์‚ฌ์šฉ ํšŸ์ˆ˜]๋กœ ๊ตฌํ•ด์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ„ ์˜ˆ์ œ๋ฅผ ์ด์šฉํ•ด๋ณด๋ฉด,

DP[1] = 5๋ฅผ 1๋ฒˆ๋งŒ ์‚ฌ์šฉ = {5}

๏นก2๊ฐœ ์ด์ƒ๋ถ€ํ„ฐ๋Š” 5๋ฅผ ์ด์–ด๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค!

 

DP[2] = 5๋ฅผ 2๋ฒˆ ์‚ฌ์šฉ = {55, 5+5, 5/5, 5*5, 5-5} = {55, DP[1]+DP[1], DP[1]/DP[1], DP[1]*DP[1], DP[1]-DP[1]}

= {55, 10, 1, 25, 0}

 

DP[3] = 5๋ฅผ 3๋ฒˆ ์‚ฌ์šฉ = {555, DP[1]+DP[2], DP[1]/DP[2], DP[1]*DP[2], DP[1]-DP[2], DP[2]+DP[1], DP[2]/DP[1], DP[2]*DP[1], DP[2]-DP[1]} = 

{555,

// DP[1] + DP[2]

5+55, 5/55, 5*55, 5-55, 5+10, 5/10, 5*10, 5-10, 5+1, 5/1, 5*1, 5-1, 5+25, 5/25, 5*25, 5-25, 5+0, 5/0, 5*0, 5-0,

// DP[2] + DP[1]

55+5, 55/5, 55*5, 55-5, 10+5, 10/5, 10*5, 10-5, 1+5, 1/5, 1*5, 1-5, 25+5, 25/5, 25*5, 25-5, 0+5, 0/5, 0*5, 0-5}

= {555, 60, 0, 275, -50, 15, 50, -5, 6, -20, 5, 4, 30, 125, INF, 11, 2, -4, 20}

 

DP[4] = 5๋ฅผ 4๋ฒˆ ์‚ฌ์šฉ = {5555, DP[1]+DP[3], DP[1]/DP[3], DP[1]*DP[3], DP[1]-DP[3], DP[2]+DP[2], DP[2]/DP[2], DP[2]*DP[2], DP[2]-DP[2], DP[3]+DP[1], DP[3]/DP[1], DP[3]*DP[1], DP[3]-DP[1]}

 

์ฆ‰, ์ ํ™”์‹์„ ๊ตฌํ•˜๋ฉด DP[i] = {N.repeat(i), DP[1](+,/,*,-)DP[i-1], DP[2](+,/,*,-)DP[i-2], ... , DP[i-1](+,/,*,-)DP[1]}

 

์ฝ”๋“œ

function solution(N, number) {
    if(N === number) return 1; // N์ด number์ธ ๊ฒฝ์šฐ ๋ฐ”๋กœ 1 ๋ฆฌํ„ด
    
    // dp[N์ด ์‚ฌ์šฉ๋œ ํšŸ์ˆ˜] = {์‚ฌ์šฉ ํšŸ์ˆ˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆ˜์˜ ์ง‘ํ•ฉ}
    const dp = Array.from({length: 9}, () => new Set());
    dp[1].add(N); // 1๋ฒˆ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋Š” N๋ฐ–์— ์—†์Œ
    
    for(let i=2;i<=8;i++) {
        dp[i].add(Number(String(N).repeat(i))); // ์‚ฌ์น™์—ฐ์‚ฐ ์—†์ด ์ˆซ์ž๋ฅผ ์ด์–ด ๋ถ™์ด๊ธฐ
        for(let j=1; j<i;j++) {
            for(const num1 of dp[j]) {
                for(const num2 of dp[i-j]) {
                    dp[i].add(num1+num2);
                    dp[i].add(num1*num2);
                    dp[i].add(num1-num2);
                    dp[i].add(Math.floor(num1/num2));
                }
            }
        }
        if(dp[i].has(number)) {
            return i;
        }
    }
    return -1;
}