๐ section08 - 9 - ๋์ ๊ตํ
๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ฌ ๋จ์์ ๋์ ๋ค์ด ์์ ๋ ๊ฑฐ์ค๋ฆ๋์ ๊ฐ์ฅ ์ ์ ์์ ๋์ ์ผ๋ก ๊ตํํ๋ ค๋ฉด ์ด๋ป๊ฒ ํ ๊น? ๊ฐ ๋จ์์ ๋์ ์ ๋ฌดํ์ ์ธ ์ ์๋ค.
// ์
๋ ฅ
3
1 2 5
15
// ์ถ๋ ฅ
// (5, 5, 5) ๋์ 3๊ฐ๋ก ๊ฑฐ์ฌ๋ฌ ์ค ์ ์๋ค.
3
๊ฑฐ์ค๋ฆ๋ ๋ฌธ์ ๋ ๊ทธ๋ฆฌ๋๋ก ํ์ด๋ณธ ์ ์๋ค. ํ์ง๋ง, ์ด ๋ฌธ์ ๋ ๊ทธ๋ฆฌ๋๋ก๋ ํ ์ ์๋ค. ์๋ํ๋ฉด ๋์ ์ ๋จ์๊ฐ ์๋ก ๋ฐฐ์ ํํ๊ฐ ์๋๋ผ ๋ฌด์์๋ก ์ฃผ์ด์ง ๊ฒฝ์ฐ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ด ๋ DFS
ํน์ DP
๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค. ๋ง์ฝ, ๋์ ์ด [500, 100, 50, 10]
์ฒ๋ผ ๋ฐฐ์ํํ๋ก ๋์ค๋ฉด ๊ทธ๋ฆฌ๋๋ก ํ ์ ์๋ค.
๋, ์์ ๋ฐฐ์ด ๋ถ๋ถ์งํฉ์ผ๋ก๋ ์ด ๋ฌธ์ ๋ฅผ ํ ์ ์๋๋ฐ, ์๋ํ๋ฉด ๋์ ์ ๊ฐ ํ ๋ฒ์ฉ ์ฐ๋ ๊ฒ์ด ์๋๊ณ ๊ฑฐ์ค๋ฆ๋์ด ๋ ์ด์ ์์ด์ง ๋๊น์ง ๋ฌดํ์ ์ผ๋ก ์ธ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ด๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ ํน์ `DP`๋ก ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ด ๋จ์๋๋ฐ, ๋์ ์ ๊ฐ์๊ฐ ์ปค์ง์๋ก ๊ณ์ฐํ๋ ๊ฐ์ง์๋ ๋์ด๋๊ธฐ ๋๋ฌธ์ edgeCut
์ ์ด์ฉํ๋ค. 11
, 12
๋ฒ ๋ผ์ธ์ฒ๋ผ ์กฐ๊ฑด์ ๊ฑธ์ด์ฃผ๋ฉด ์ฐ์ฐ ํ์๋ฅผ ๋ํญ ๋ฎ์ถ ์ ์๋ค. ์ฝ๊ฐ์ ํ์ ์ถ๊ฐํ์๋ฉด coin
์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ์ ํ๊ณ ๋์ DFS
๋ก ๋ค์ด๊ฐ๋ ๊ฒ์ธ๋ฐ, ์ ๋ ฌํ๋๋ฐ ์๊ฐ์ด ์กฐ๊ธ ๋ค๋๋ผ๋(O(NlogN)
) ๊ฑฐ์ค๋ฆ๋์ ๋์ ์ ํฐ ๋จ์๋ฅผ ๋จผ์ ์ฃผ๋ ๊ฒ์ด ํ์๋ฅผ ๋ฎ์ถ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฑฐ์ค๋ฆ๋์ ํฐ ๋จ์๋ถํฐ ๋ฐ๊ฟ์ค ๋ ์ฌ๊ท ํ๋ฆ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
let n = 3;
let coin = [1, 2, 5];
let change = 15;
console.log(solution(n, coin, change));
function solution(n, coin, change) {
let answer = Number.MAX_SAFE_INTEGER;
coin.sort((a, b) => b - a); // ๊ฑฐ์ค๋ฆ๋์ ํฐ ๋จ์๋ถํฐ ๋ฐ๊ฟ์ฃผ๋ฉด์ ์ฐ์ฐํ์๋ฅผ ๋จ์ถ์ํจ๋ค.
function DFS(L, sum) {
if (sum > change) return; // change๋ณด๋ค sum์ด ํฌ๋ฉด ๋ ์ด์ ๊ณ์ฐ ํ ํ์๊ฐ ์์.
if (answer <= L) return; // answer๋ณด๋ค ์์ ๊ฐ์ ๊ตฌํด์ผํ๋๋ฐ L์ด ๋ ํฌ๋ฉด ๊ฐ์ง์น๊ธฐ๋ฅผ ๋ ์ด์ ํ ํ์๊ฐ ์์.
if (sum === change) {
answer = Math.min(answer, L);
} else {
for (let i = 0; i < n; i++) {
DFS(L + 1, sum + coin[i]);
}
}
}
DFS(0, 0);
return answer;
}
๋๊ธ