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

[JavaScript/section 9] 02 - ๊ฒฝ๋กœ ํƒ์ƒ‰(์ธ์ ‘ ๋ฆฌ์ŠคํŠธ)

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

๐Ÿ“Œ 02 - ๊ฒฝ๋กœ ํƒ์ƒ‰(์ธ์ ‘ ๋ฆฌ์ŠคํŠธ)

๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์ง€๋ฉด 1๋ฒˆ ์ •์ ์—์„œ N๋ฒˆ ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์˜ ๊ฐ€์ง€ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”. ์•„๋ž˜ ๊ทธ๋ž˜ํ”„์—์„œ 1๋ฒˆ ์ •์ ์—์„œ 5๋ฒˆ ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ๊ฐ€์ง€ ์ˆ˜๋Š” ์ด 6๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.

 

์ด์ „ ๋ฌธ์ œ์™€ ๊ฐ™์€ ๋ฌธ์ œ์ด์ง€๋งŒ ์ธ์ ‘ ํ–‰๋ ฌ์ด ์•„๋‹Œ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์ •์ ์ด ์ ๋‹ค๋ฉด ์ธ์ ‘ ํ–‰๋ ฌ๋กœ ํ’€์–ด๋„ ๋˜์ง€๋งŒ ๋ฌด์ˆ˜ํžˆ ๋งŽ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„, ์‹œ๊ฐ„ ๋ณต์žก๋„ ์ฆ๊ฐ€์™€ ๊ฐ™์€ ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•œ๋‹ค. ๐Ÿ’ฉ๐Ÿ’ฉ

์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค.

v ์ •์ (ํ–‰)์—์„œ ์ด๋™ ๊ฐ€๋Šฅํ•œ ์ •์ ์„ ๊ฐ๊ฐ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•œ๋‹ค.

 

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

v - ํ˜„์žฌ ์ •์ , i - ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค, ch - ํ•ด๋‹น ์ •์ ์„ ์ง€๋‚ฌ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ฐฐ์—ด

graph[v][i] - ํ˜„์žฌ ์ •์ ์—์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์ ์œผ๋กœ node ๋ณ€์ˆ˜์— ์ €์žฅ

  • ์žฌ๊ท€๋ฅผ ๋Œ๋ฉด์„œ ch[node]๊ฐ€ 0์ด๋ผ๋ฉด v ์ •์ ์—์„œ node ์ •์ ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํ•ด๋‹น ์ •์ ์œผ๋กœ ์ด๋™ํ–ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ch[node]๋ฅผ 1๋กœ ์žฌํ• ๋‹นํ•œ๋‹ค.
  • DFS(node) ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ข…๋ฃŒ๊ฐ€ ๋˜๋ฉด ๋‹ค์Œ์— ํ•ด๋‹น ์ •์ ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ch[node]๋ฅผ 0์œผ๋กœ ๋‹ค์‹œ ์žฌํ• ๋‹นํ•œ๋‹ค. (๋ฐฑํŠธ๋ž˜ํ‚น)
  • v์™€ n์ด ๊ฐ™๋‹ค๋ฉด ํ•˜๋‚˜์˜ ๊ฒฝ์šฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด๋ฏ€๋กœ answer์— 1์„ ๋”ํ•ด์ค€๋‹ค.

์ฃผ์˜ํ•  ์ โ— 1๋ฒˆ ์ •์ ์—์„œ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ ch ๋ฐฐ์—ด์˜ 1๋ฒˆ ์ธ๋ฑ์Šค๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”ํ•œ ๋‹ค์Œ ์žฌ๊ท€๋ฅผ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.

function solution(n, arr) {
  let answer = 0;
  const graph = Array.from(Array(n + 1), () => Array());
  const ch = Array.from({ length: n + 1 }, () => 0);

  // ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ
  for (let [a, b] of arr) {
    graph[a].push(b);
  }

  function DFS(v) {
    if (v === n) {
      answer++;
    } else {
      for (let i = 0; i < graph[v].length; i++) {
        const node = graph[v][i];

        if (ch[node] === 0) {
          ch[node] = 1;
          DFS(node);
          ch[node] = 0;
        }
      }
    }
  }

  ch[1] = 1;
  DFS(1);

  return answer;
}

let arr = [
  [1, 2],
  [1, 3],
  [1, 4],
  [2, 1],
  [2, 3],
  [2, 5],
  [3, 4],
  [4, 2],
  [4, 5],
];
console.log(solution(5, arr));