๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/์ธํ”„๋Ÿฐ(inflearn)

[ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript) ] section08 - 9 - ๋™์ „๊ตํ™˜

by YWTechIT 2021. 9. 23.
728x90

๐Ÿ“ 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)) ๊ฑฐ์Šค๋ฆ„๋ˆ์€ ๋™์ „์˜ ํฐ ๋‹จ์œ„๋ฅผ ๋จผ์ € ์ฃผ๋Š” ๊ฒƒ์ด ํšŸ์ˆ˜๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ํฐ ๋‹จ์œ„๋ถ€ํ„ฐ ๋ฐ”๊ฟ”์ค„ ๋•Œ ์žฌ๊ท€ ํ๋ฆ„๋„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

728x90

 

 

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;
}
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€