728x90
๐ section10 - 4 - ๋์ ๊ตํ(๋ ์ ์๊ณ ๋ฆฌ์ฆ)
๋ฌธ์ : ๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ฌ ๋จ์์ ๋์ ๋ค์ด ์ฃผ์ด์ ธ ์์ ๋ ๊ฑฐ์ค๋ฆ๋์ ๊ฐ์ฅ ์ ์ ์์ ๋์ ์ผ๋ก ๊ตํํด์ฃผ๋ ค๋ฉด ์ด๋ป๊ฒ ์ฃผ๋ฉด ๋๋๊ฐ? ๊ฐ ๋จ์์ ๋์ ์ ๋ฌดํ์ ์ธ ์ ์๋ค.
// ์
๋ ฅ
3
1 2 5
15
// ์ถ๋ ฅ
// (5, 5, 5) ๋์ 3๊ฐ๋ก ๊ฑฐ์ฌ๋ฌ ์ค ์ ์๋ค.
3
๋์ ๊ตํ ๋ฌธ์ ๋ ์ ๋ฒ์ dfs(๋ถ๋ถ์งํฉ) + edgeCut
์ ์ด์ฉํด์ ํผ ์ ์ด ์๋ค. ๋ง์ฝ์ ๋์ ์ ์ข
๋ฅ๊ฐ 100๊ฐ ์ด์, ๊ฑฐ์ค๋ฆ ๋์ด 100,000 ์ด์์ผ ๊ฒฝ์ฐ DFS
๋ก ํ ์ ์๋ค. ์ด๋ด ๋๋ DP
์์ ๋
์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ด์ผ ํ๋ค.
dp
๋ ๊ฑฐ์ฌ๋ฌ์ค ๋(m)๋งํผ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ ์ธํ๊ณ ์ต์ ๋์ ์ ๊ฐ์๋ฅผ ๊ตฌํด์ผ ํ๋ฏ๋ก ๊ฐ์๋ฅผ ์ ์ผ ๋ง์ด ๊ฑฐ์ฌ๋ฌ์ฃผ๋ ๊ฐ์๋ณด๋ค ํฐ ๊ฐ์ผ๋ก ์ค์ ํ๋ค.(๋ฌธ์ ์์ ๊ธ์ก์ ์ต๋ 500์๊น์ง์ธ๋ฐ, ๋ค๋ฅธ ๋์ ์ ๋นํด 1์์ผ๋ก 500์์ ๊ฑฐ์ฌ๋ฌ์ฃผ๋ ๊ฐ์๊ฐ ์ ์ผ ๋ง์ผ๋ฏ๋ก 1์์ง๋ฆฌ ๋์ 500๊ฐ๊ฐ ํ์ํ๋ฏ๋กdp
๋ 500๋ณด๋ค ํฐ ๊ฐ์ผ๋ก ์ด๊ธฐํ ์ํจ๋ค. )dp[j]
:j
๊ธ์ก์ ๊ฑฐ์ฌ๋ฌ ์ค ๋ ์ฌ์ฉ๋๋ ์ต์ ๋์ ์ ๊ฐ์- ํต์ฌ ๋ก์ง: ํ์ฌ ๊ฑฐ์ฌ๋ฌ์ค์ผ ํ ๋์ ์ ๊ธ์ก๋งํผ ๋นผ์ฃผ๊ณ ์ด์ ์ ๊ฑฐ์ฌ๋ฌ ์คฌ๋ ๋์ ์ ์ต์ ๊ฐ์ + 1 (ํ์ฌ ๋ด๊ฐ ๊ฑฐ์ฌ๋ฌ์ฃผ๋ ๋์ ์ ๊ฐ์)
- 0์์ ๊ฑฐ์ฌ๋ฌ์ฃผ๋ ๋์ ์ ๊ฐ์
dp[0]=0
- n์์
dp[n]
๋ถํฐ ์์ํ๋ค.
728x90
let n = 3;
let coin = [1, 2, 5];
let change = 15;
console.log(solution(n, coin, change));
function solution(n, coin, change){
let dp = Array.from({length: change+1}, () => 1000);
dp[0]=0; // 0์์ ๊ฑฐ์ฌ๋ฌ ์ฃผ๋ ๊ฒฝ์ฐ์ ์ 0
for (let i=0; i<n; i++){
for (let j=coin[i]; j<=change; j++){
dp[j]=Math.min(dp[j], dp[j-coin[i]]+1);
}
}
return dp[change];
}
๐๐ฝ 3
๋ฐ์ํ
๋๊ธ