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

[JavaScript/section 9] 03 - 미둜 탐색

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

πŸ“Œ 03 - 미둜 탐색(DFS)

7*7 격자판 미둜λ₯Ό νƒˆμΆœν•˜λŠ” 경둜의 κ°€μ§“μˆ˜λ₯Ό 좜λ ₯ν•˜λŠ” λ¬Έμ œμ΄λ‹€. μΆœλ°œμ μ€ 격자의 (1, 1) μ’Œν‘œμ΄κ³ , νƒˆμΆœ 도착점은 (7, 7) μ’Œν‘œμ΄λ‹€. 격자판의 1은 벽이고, 0은 ν†΅λ‘œμ΄λ‹€. 격자판의 μ›€μ§μž„μ€ μƒν•˜μ’Œμš°λ‘œλ§Œ 움직인닀. λ―Έλ‘œκ°€ λ‹€μŒκ³Ό κ°™λ‹€λ©΄

μœ„μ˜ μ§€λ„μ—μ„œ μΆœλ°œμ μ—μ„œ λ„μ°©μ κΉŒμ§€ 갈 수 μžˆλŠ” λ°©λ²•μ˜ μˆ˜λŠ” 8가지 이닀.

 

πŸ“ 풀이 방법

nx - 이동할 ν–‰, ny - 이동할 μ—΄

  • μƒν•˜μ’Œμš°λ‘œλ§Œ 움직일 수 μžˆμœΌλ―€λ‘œ 움직일 수 μžˆλŠ” 경우의 μˆ˜λŠ” 4가지이닀.
  • μž¬κ·€λ₯Ό λŒλ©΄μ„œ λ‹€μŒμ— 이동할 μ’Œν‘œκ°€ κ²©μžνŒμ„ λ²—μ–΄λ‚˜μ§€ μ•ŠλŠ”μ§€ ν™•μΈν•œ λ‹€μŒ 이동이 κ°€λŠ₯ν•œ ν†΅λ‘œκ°€ λ§žλŠ”μ§€ 확인 ν•΄μ•Ό ν•œλ‹€.
  • board[nx][ny] (이동할 μ’Œν‘œ)κ°€ 0이라면 이동이 κ°€λŠ₯ν•œ κ²ƒμ΄λ―€λ‘œ μ΄λ™ν•˜κ³  μ΄λ™ν–ˆμŒμ„ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ board[nx][ny]λ₯Ό 1둜 재 ν• λ‹Ήν•œλ‹€. (μ™”λ˜ 길을 λ°”λ‘œ λŒμ•„κ°€λŠ” λΆˆμƒμ‚¬λ₯Ό 막기 μœ„ν•¨)
  • DFS() ν•¨μˆ˜κ°€ μ’…λ£Œν•˜κ³  λ‚˜λ©΄ board[nx][ny]λ₯Ό 0으둜 재 ν• λ‹Ήν•¨μœΌλ‘œμ¨ λ‹€μŒμ— 이동이 κ°€λŠ₯ν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€. (λ°±νŠΈλž˜ν‚Ή)
  • x와 yκ°€ 6이라면 νƒˆμΆœ 도착점(6, 6) μ’Œν‘œμ— μžˆλŠ” κ²ƒμ΄λ―€λ‘œ answer++을 ν•΄μ€€λ‹€.

주의 사항❗ μž¬κ·€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 board[0][0] (좜발점)을 1둜 μ΄ˆκΈ°ν™” ν•΄μ•Ό ν•œλ‹€.

function solution(board) {
  let answer = 0;
  let dx = [-1, 0, 1, 0];
  let dy = [0, 1, 0, -1];

  function DFS(x, y) {
    if (x === 6 && y === 6) {
      answer++;
    } else {
      for (let i = 0; i < 4; i++) {
        let nx = x + dx[i];
        let ny = y + dy[i];

        if (nx >= 0 && ny >= 0 && nx <= 6 && ny <= 6) {
          if (board[nx][ny] === 0) {
            board[nx][ny] = 1;
            DFS(nx, ny);
            board[nx][ny] = 0;
          }
        }
      }
    }
  }

  // 좜발점 체크
  board[0][0] = 1;
  DFS(0, 0);

  return answer;
}

let arr = [
  [0, 0, 0, 0, 0, 0, 0],
  [0, 1, 1, 1, 1, 1, 0],
  [0, 0, 0, 1, 0, 0, 0],
  [1, 1, 0, 1, 0, 1, 1],
  [1, 1, 0, 0, 0, 0, 1],
  [1, 1, 0, 1, 1, 0, 0],
  [1, 0, 0, 0, 0, 0, 0],
];

console.log(solution(arr));