Algorithm/์ธํ”„๋Ÿฐ(inflearn)

[ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript) ] section08 - 13 - ์ˆ˜์—ด ์ถ”์ธกํ•˜๊ธฐ

YWTechIT 2021. 9. 29. 18:03
728x90

๐Ÿ“ section08 - 13 - ์ˆ˜์—ด ์ถ”์ธกํ•˜๊ธฐ

๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๊ฐ€์žฅ ์œ—์ค„์— 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ˆซ์ž๊ฐ€ ํ•œ ๊ฐœ์”ฉ ์ ํ˜€ ์žˆ๋‹ค. ํŒŒ์Šค์นผ์˜ ์‚ผ๊ฐํ˜•์„ ์˜ˆ๋กœ ๋“ค์–ด N์ด 4์ด๊ณ  ๊ฐ€์žฅ ์œ— ์ค„์— 3 1 2 4๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ทธ๋ ค์ง„๋‹ค.

 

 

N๊ณผ ๊ฐ€์žฅ ๋ฐ‘์— ์žˆ๋Š” ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ ธ ์žˆ์„ ๋•Œ ๊ฐ€์žฅ ์œ—์ค„์— ์žˆ๋Š” ์ˆซ์ž๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹ต์ด ๋‚˜์˜ค๋ฉด ์‚ฌ์ „ ์ˆœ์œผ๋กœ ๊ฐ€์žฅ ์•ž์— ์˜ค๋Š” ๊ฒƒ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

// ์ž…๋ ฅ
4 16

// ์ถœ๋ ฅ
3 1 2 4

 

๋ฌธ์ œ๋งŒ ๋ณด๋ฉด ์กฐ๊ธˆ ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผ ํ• ์ง€ ์ˆœ์„œ๋ฅผ ๋‚˜๋ˆ„๋‹ˆ๊นŒ ๊ดœ์ฐฎ์•˜๋‹ค. ํŒŒ์Šค์นผ์˜ ์‚ผ๊ฐํ˜• ๊ณต์‹์„ ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ, ์กฐํ•ฉ๊ณต์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์Šค์นผ ์‚ผ๊ฐํ˜•์„ ๊ตฌํ•  ๋•Œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋‘ ํ•ญ์„ ๋”ํ•ด์„œ ๋ˆ„์ ํ•˜๋Š” ๋ถˆ ํ•„์š”ํ•œ ๊ณ„์‚ฐ์„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 1 2 3 4๊ฐ€ ์ฃผ์–ด์ง„๋‹ค๊ณ  ํ•  ๋•Œ ๋ชจ๋“  ์ˆ˜๋ฅผ ์ฐจ๋ก€๋กœ ๋”ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

 

์‚ฌ์ง„ ์ œ์ผ ํ•˜๋‹จ์— ์žˆ๋Š” 1+2+2+2+3+3+3+4์˜ ๊ฐ’์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋‹ˆ 1์€ 1๋ฒˆ, 2๋Š” 3๋ฒˆ, 3์€ 3๋ฒˆ, 4๋Š” 1๋ฒˆ์ด ์‚ฌ์šฉ๋๋‹ค. ์ž…๋ ฅ์ด 1 2 3 4๊ฐ€ ์•„๋‹ˆ์–ด๋„ 4๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋žœ๋ค์œผ๋กœ ์ผ๋ ฌ๋กœ ๋‚˜์—ดํ•˜์—ฌ ๊ตฌํ•ด๋„ ์‚ฌ์šฉ๋œ ๊ฐœ์ˆ˜๋Š” 1 3 3 1๋กœ ๋™์ผํ•˜๋‹ค. (5๊ฐœ์˜ ์ˆซ์ž๋Š” 1 4 6 4 1๋ฒˆ์”ฉ ์“ฐ์ธ๋‹ค.) ์ด๋ฅผ ์กฐํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š”๋ฐ, 1 3 3 1์€ 3C0, 3C1, 3C2, 3C3์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ  n๊ฐœ ์ผ ๋•Œ๋Š” n-1C0, n-1C1, ..., n-1Cn-2, n-1Cn-1์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

๋‹ค์‹œ ๋ฌธ์ œ๋กœ ๋Œ์•„๊ฐ€์„œ ์ถœ๋ ฅ ๊ฐ’์€ ํŒŒ์Šค์นผ ์‚ผ๊ฐํ˜•์— ๊ฐ€์žฅ ์œ—์ค„์— ์žˆ๋Š” ์ˆซ์ž๋ผ๋ฆฌ ๋”ํ•œ ๊ฐ’์ด `target`๊ณผ ๊ฐ™์€ ์ˆซ์ž๋ฅผ ์ถœ๋ ฅํ•ด์•ผํ•˜๋Š”๋ฐ, ์ •ํ™•ํ•˜๊ฒŒ ์–ด๋–ค ์ˆ˜๊ฐ€ target๊ณผ ๋™์ผํ•œ์ง€ ๋ชจ๋ฅด๋‹ˆ๊นŒ 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ผ๋ ฌ๋กœ ๋‚˜์—ดํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜(์ค‘๋ณต์„ ํ—ˆ๋ฝํ•˜์ง€ ์•Š๋Š” ์ˆœ์—ด, ์—ฌ๊ธฐ์„œ๋Š” 4*3*2*1=24)๋ฅผ ์ฐพ๊ณ  ํ•ด๋‹น ์ˆ˜๋ฅผ ํŒŒ์Šค์นผ์˜ ๊ณต์‹ 1 3 3 1์„ ์ด์šฉํ•˜์—ฌ ํ•˜๋‚˜์”ฉ ๊ณฑํ•ด์„œ ๋ชจ๋‘ ๋”ํ•œ ๊ฐ’์ด target๊ณผ ๊ฐ™์€์ง€ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

 

์ค‘๋ณต์„ ํ—ˆ๋ฝํ•˜์ง€ ์•Š๋Š” ์ˆœ์—ด์€ visited ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒดํฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์žฌ๊ท€๋ฅผ ์ด์šฉํ•˜์—ฌ ์ˆœ์—ด์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•˜์ž.

 

์—ฌ๋‹ด์œผ๋กœ ํ’€์ด๋ฅผ ๋ณด์ง€์•Š๊ณ  ๋‚ด๊ฐ€ ํ’€์—ˆ์„ ๋•Œ๋Š” ์กฐํ•ฉ(1 3 3 1)์„ ํ•œ ๋ฒˆ์— ๊ตฌํ•ด๋†“๊ณ  ์ข…๋ฃŒ ์กฐ๊ฑด์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ `for`๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ index๋ผ๋ฆฌ ๊ณฑํ–ˆ๋Š”๋ฐ ์„ ์ƒ๋‹˜์€ ์•„์˜ˆ DFS ํ•จ์ˆ˜ ์ธ์ž์— sum์„ ๋„ฃ์–ด ์žฌ๊ท€๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ๋งˆ๋‹ค ๋”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์…จ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ณ„์‚ฐํ•˜๋ฉด ์ข…๋ฃŒ์กฐ๊ฑด์— ๋„๋‹ฌํ• ๋•Œ๋งˆ๋‹ค `for`๋ฌธ์„ ๋Œ์•„๋„ ๋˜์ง€ ์•Š์•„์„œ ์ „์ž๋ณด๋‹ค ์—ฐ์‚ฐ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 

  1. 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ค‘๋ณต์„ ํ—ˆ๋ฝํ•˜์ง€ ์•Š๊ณ  ์ผ๋ ฌ๋กœ ๋‚˜์—ดํ•˜๋Š” ๋ฐฉ๋ฒ•(์ค‘๋ณต์„ ํ—ˆ๋ฝํ•˜์ง€ ์•Š๋Š” ์ˆœ์—ด)์„ ๊ตฌํ•œ๋‹ค.
  2. n-1C0 ~ n-1Cn-1๊นŒ์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.(์ด๋•Œ, ์—ฐ์‚ฐ์†๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‚ฌ์šฉ)
  3. 1๋ฒˆ์—์„œ ๊ตฌํ•œ ๊ฐ’์„ ๊ฐ๊ฐ์˜ index์— ๋งž๊ฒŒ 2๋ฒˆ ๊ฐ’์„ ๊ณฑํ•œ๋‹ค. (DFSํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ ์žฌ๊ท€๊ฐ€ ๋ป—์–ด๋‚˜๊ฐˆ ๋•Œ๋งˆ๋‹ค ๊ณ„์‚ฐํ•œ๋‹ค.)
  4. 3๋ฒˆ์—์„œ ๊ตฌํ•œ ๊ฐ’์„ ๋ชจ๋‘ ๋”ํ•ด target๊ณผ ๊ฐ™์€ ๊ฐ’์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
  5. ์ฒ˜์Œ์œผ๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋˜๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. (flag=true๋กœ ๋ฐ”๊ฟ” ๊ทธ๋‹ค์Œ ๋ถˆ ํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ค„์ธ๋‹ค.)

 

728x90

 

let n = 4;
let target = 16;

console.log(solution(n, target));

function solution(n, target){
  let memo = Array.from(Array(11), () => Array(11).fill(0));
  let visited = Array.from({length: n+1}, () => 0);
  let arr = Array.from({length: n}, () => 0);
  let combi = Array.from({length: n}, () => 0);
  let answer;

  function pascal(n, r){
    if (memo[n][r]) return memo[n][r];
    if (n===r || r===0) return 1;
    else return memo[n][r] = pascal(n-1, r-1) + pascal(n-1, r);
  }

  for (let i=0; i<n; i++) combi[i] = pascal(n-1, i);

  let flag = false;

  function DFS(L, sum){
    if (flag) return;
    if (L === n && sum === target){
      answer = arr.slice();
      flag = true;
    }else{
      for (let i=1; i<=n; i++){
        if (visited[i] === 0){
          visited[i] = 1;
          arr[L] = i;
          DFS(L+1, sum+(arr[L]*combi[L]));
          visited[i]=0;
        }
      }
    }
  }

  DFS(0, 0)
  return answer;
}
๐Ÿ‘‰๐Ÿฝ 3 1 2 4
๋ฐ˜์‘ํ˜•