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

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค-12907] ๊ฑฐ์Šค๋ฆ„๋ˆ

by alswlfl 2026. 6. 17.

[DP]-๊ฑฐ์Šค๋ฆ„๋ˆ

 

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

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

programmers.co.kr

 

๋ฌธ์ œ ์„ค๋ช…

๊ฑฐ์Šฌ๋Ÿฌ ์ค˜์•ผ ํ•˜๋Š” ๊ธˆ์•ก n๊ณผ ํ˜„์žฌ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ๋ˆ์˜ ์ข…๋ฅ˜ money๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, Finn์ด n์›์„ ๊ฑฐ์Šฌ๋Ÿฌ ์ค„ ๋ฐฉ๋ฒ•์˜ ์ˆ˜ return

 

[์ œํ•œ ์‚ฌํ•ญ]

  • n์€ 100,000 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜
  • ํ™”ํ ๋‹จ์œ„๋Š” 100์ข…๋ฅ˜ ์ดํ•˜
  • ๋ชจ๋“  ํ™”ํ๋Š” ๋ฌดํ•œํ•˜๊ฒŒ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •
  • ์ •๋‹ต์ด ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ, 1,000,000,007๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€ return

 

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

n money result
5 [1,2,5] 4

 

ํ’€์ด ๋ฐฉ๋ฒ•

DP ๋ฐฐ์—ด ์„ค์ •์„ ์ž˜ ํ•ด์ฃผ์–ด์•ผ ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ž„..

DP = i์› ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํšŸ์ˆ˜

 

์œ„์˜ ์˜ˆ์‹œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ Bottom-Up์œผ๋กœ ๊ตฌํ•ด๋ณด๋ฉด,

1) ๊ฑฐ์Šค๋ฆ„๋ˆ 0์€ ์•„๋ฌด๊ฒƒ๋„ ๊ฑฐ์Šฌ๋Ÿฌ ์ฃผ์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ 1๋กœ ์ฑ„์šฐ๊ธฐ

0์› 1์› 2์› 3์› 4์› 5์›
1 0 0 0 0 0

 

2) 1์›์„ ์ด์šฉํ•ด์„œ 1์›~5์› ๊ฑฐ์Šฌ๋Ÿฌ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ตฌํ•˜๋ฉด,

1์› = 1, 2์› = 1+1, 3์› = 1+1+1, 4์› = 1+1+1+1, 5์› = 1+1+1+1+1 โ–ถ๏ธŽ ๋ชจ๋‘ 1๊ฐœ์”ฉ ์กด์žฌ

0์› 1์› 2์› 3์› 4์› 5์›
1 1 1 1 1 1

 

3) 2์›์„ ์ด์šฉํ•ด์„œ 2~5์› ๊ฑฐ์Šฌ๋Ÿฌ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ตฌํ•˜๋ฉด,

2์› = 0+2/1+1, 3์› = 1+2/1+1+1, 4์› = 2+2/2+1+1/1+1+1+1, 5์› = 1+2+2/1+1+1+2/1+1+1+1+1

0์› 1์› 2์› 3์› 4์› 5์›
1 1 1+1=2 1+1=2 1+2=3 1+2=3

 

4) 5์›์„ ์ด์šฉํ•ด์„œ 5์› ๊ฑฐ์Šฌ๋Ÿฌ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ตฌํ•˜๋ฉด,

5์› = 5/1+2+2/1+1+1+2/1+1+1+1+1

0์› 1์› 2์› 3์› 4์› 5์›
1 1 2 2 3 3+1=4

 

์—ฌ๊ธฐ์„œ ๊ทœ์น™์ด ๋ฐœ์ƒํ•จ

DP[i] = DP[i] + DP[i-ํ™”ํ]

์ฆ‰, Bottom-Up ๋ฐฉ์‹์œผ๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ํ•ฉ๊ณ„ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ

์ฝ”๋“œ

function solution(n, money) {
    const DIV = 1000000007; // ๋‚˜๋ˆŒ ์ˆ˜
    
    // ๊ฑฐ์Šค๋ฆ„๋ˆ DP ๋ฐฐ์—ด: DP[๊ฑฐ์Šค๋ฆ„๋ˆ] = ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ๊ฑฐ์Šฌ๋Ÿฌ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
    const dp = Array.from({length: n+1}, () => 0);
    dp[0] = 1; // ์•„๋ฌด๊ฒƒ๋„ ๊ฑฐ์Šฌ๋Ÿฌ ์ฃผ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜์ธ 1 ๋„ฃ๊ธฐ
    
    for(const m of money) {
        for(let c=m; c<=n; c++) {
            dp[c] += (dp[c-m]%DIV); // DP ๊ทœ์น™ ์ ์šฉ
        }
    }
    
    return dp[n];
}

์ฐธ๊ณ  ์‚ฌ์ดํŠธ

https://review-answer.tistory.com/27

 

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ฑฐ์Šค๋ฆ„๋ˆ_Java

๋ฌธ์ œ ๋งํฌhttps://school.programmers.co.kr/learn/courses/30/lessons/12907 ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ

review-answer.tistory.com