Algorithm/μΈν”„λŸ°(inflearn)

[JavaScript/section 9] 01 - 경둜 탐색(인접 ν–‰λ ¬)

_μ„±ν˜Έ_ 2022. 11. 15. 17:55
728x90
λ°˜μ‘ν˜•

πŸ“Œ 01 - 경둜 탐색(DFS-인접 ν–‰λ ¬: λ…Έλ“œ κ°œμˆ˜κ°€ 적을 λ•Œ)

λ°©ν–₯ κ·Έλž˜ν”„κ°€ 주어지면 1번 μ •μ μ—μ„œ N번 μ •μ μœΌλ‘œ κ°€λŠ” λͺ¨λ“  경둜의 가지 수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”. μ•„λž˜ κ·Έλž˜ν”„μ—μ„œ 1번 μ •μ μ—μ„œ 5번 μ •μ μœΌλ‘œ κ°€λŠ” 가지 μˆ˜λŠ” 총 6가지 μž…λ‹ˆλ‹€.

 

λ‹€μŒκ³Ό 같이 λ°©ν–₯ κ·Έλž˜ν”„κ°€ 주어지면 인접 ν–‰λ ¬λ‘œ ν‘œν˜„ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.

인접 ν–‰λ ¬

v 정점(ν–‰)μ—μ„œ i 정점(μ—΄)으둜 κ°€λŠ” κ²½λ‘œκ°€ μ‘΄μž¬ν•œλ‹€λ©΄ 1, μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 0으둜 ν‘œμ‹œν•œλ‹€.

 

πŸ“ 풀이 방법

v - ν˜„μž¬ 정점, i - λ§ˆμ§€λ§‰μœΌλ‘œ λ„λ‹¬ν•΄μ•Όν•˜λŠ” 정점

ch - ν•΄λ‹Ή 정점을 μ§€λ‚¬λŠ”μ§€ μ²΄ν¬ν•˜λŠ” λ°°μ—΄

  • μž¬κ·€λ₯Ό λŒλ©΄μ„œ graph[v][i]λŠ” 1이고 ch[i]λŠ” 0이라면 v μ •μ μ—μ„œ i μ •μ μœΌλ‘œ 이동할 수 μžˆλ‹€λŠ” κ²ƒμ΄λ―€λ‘œ ν•΄λ‹Ή μ •μ μœΌλ‘œ μ΄λ™ν–ˆμŒμ„ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ ch[i]λ₯Ό 1둜 μž¬ν• λ‹Ήν•œλ‹€.
  • DFS(i) ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  μ’…λ£Œκ°€ 되면 λ‹€μŒμ— ν•΄λ‹Ή μ •μ μœΌλ‘œ 이동할 수 μžˆλ„λ‘ ch[i]λ₯Ό 0으둜 λ‹€μ‹œ μž¬ν• λ‹Ήν•œλ‹€. (λ°±νŠΈλž˜ν‚Ή)
  • v와 n이 κ°™λ‹€λ©΄ ν•˜λ‚˜μ˜ κ²½μš°κ°€ λ§Œλ“€μ–΄μ§„ κ²ƒμ΄λ―€λ‘œ answer에 1을 더해쀀닀.

μ£Όμ˜ν•  점❗ 1번 μ •μ μ—μ„œ μ‹œμž‘ν•˜λ―€λ‘œ ch λ°°μ—΄μ˜ 1번 인덱슀λ₯Ό 1둜 μ΄ˆκΈ°ν™”ν•œ λ‹€μŒ μž¬κ·€λ₯Ό μ‹œμž‘ν•΄μ•Ό ν•œλ‹€.

1번 μ •μ μ—μ„œ 5번 μ •μ μœΌλ‘œ κ°€λŠ” κ²½λ‘œμ€‘ 1 2 3 4 5λ₯Ό μ§€λ‚˜λŠ” 경둜

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

  for (let [a, b] of arr) {
    graph[a][b] = 1;
  }

  function DFS(v) {
    if (v === n) {
      answer++;
    } else {
      for (let i = 1; i <= n; i++) {
        if (graph[v][i] === 1 && ch[i] === 0) {
          ch[i] = 1;
          DFS(i);
          ch[i] = 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));