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

[JavaScript/section 8] 13 - ์ˆ˜์—ด ์ถ”์ธกํ•˜๊ธฐ

_์„ฑํ˜ธ_ 2022. 11. 10. 10:27
728x90
๋ฐ˜์‘ํ˜•

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

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

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

์ž…๋ ฅ์˜ˆ์ œ
4 16
์ถœ๋ ฅ์˜ˆ์ œ
3 1 2 4


์ด๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ์•Œ์•„์•ผํ•œ๋‹ค.

๋นจ๊ฐ„ ์ƒ‰๊ณผ ๊ฐ™์ด ์ˆœ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์ˆซ์ž๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ n-1C0, n-1C1, n-1C2, n-1C3๋ฒˆ ๋”ํ•ด์ง„ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ์ˆœ์—ด ๊ตฌํ•˜๊ธฐ์™€ ์กฐํ•ฉ์˜ ๊ฒฝ์šฐ ์ˆ˜ ๋ฌธ์ œ๋ฅผ ์‘์šฉํ•œ ๋ฌธ์ œ์ด๋‹ค.

๐Ÿ“ ํ’€์ด ๋ฐฉ๋ฒ•

  • ์œ„ ๊ทœ์น™์— ๋”ฐ๋ผ ์กฐํ•ฉ ์ˆ˜๋ฅผ c ๋ฐฐ์—ด์— ๋ฏธ๋ฆฌ ์ €์žฅํ•œ๋‹ค.
  • ์žฌ๊ท€๋ฅผ ๋Œ๋ฉด์„œ(์ˆœ์—ด์„ ๊ตฌํ•˜๋Š” ๊ณผ์ •) ์ˆซ์ž๋ฅผ ํ•˜๋‚˜์”ฉ ์„ ํƒํ•  ๋•Œ๋งˆ๋‹ค sum์— p[L] * c[L]์„ ๋”ํ•ด์ค€๋‹ค.
  • L(๋ ˆ๋ฒจ)๊ณผ n์ด ๊ฐ™๊ณ  sum(์‚ผ๊ฐํ˜•์—์„œ ๊ฐ€์žฅ ๋ฐ‘์— ์žˆ๋Š” ์ˆซ์ž)๊ณผ f๊ฐ€ ๊ฐ™๋‹ค๋ฉด ํ•˜๋‚˜์˜ ๋‹ต์ด ์™„์„ฑ๋œ ๊ฒƒ์ด๋ฏ€๋กœ p ๋ฐฐ์—ด์„ ์–•์€ ๋ณต์‚ฌํ•˜์—ฌ answer์— ํ• ๋‹นํ•ด์ค€๋‹ค.
  • ์‚ฌ์ „์ˆœ์œผ๋กœ ๊ฐ€์žฅ ์•ž์— ์˜ค๋Š” ๊ฒƒ์„ ์ถœ๋ ฅํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ๋‹ต์ด ์™„์„ฑ๋˜๋ฉด flag์— 1์„ ํ• ๋‹นํ•˜์—ฌ ๋‚˜๋จธ์ง€๋ฅผ ๋ชจ๋‘ returnํ•œ๋‹ค.

function solution(n, f) {
  let answer,
    flag = 0;
  const dy = Array.from(Array(11), () => Array(11).fill(0));
  const ch = Array.from({ length: n + 1 }, () => 0);
  const p = Array.from({ length: n }, () => 0);
  const c = Array.from({ length: n }, () => 0);

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

  function DFS(L, sum) {
    if (flag) return;
    if (L === n && sum === f) {
      answer = p.slice();
      flag = 1;
    } else {
      for (let i = 1; i <= n; i++) {
        if (ch[i] === 0) {
          ch[i] = 1;
          p[L] = i;
          DFS(L + 1, sum + p[L] * c[L]);
          ch[i] = 0;
        }
      }
    }
  }

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

  DFS(0, 0);

  answer = answer.join(' ');
  return answer;
}

console.log(solution(4, 16));