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

[JavaScript/section 9] 06 - μ„¬λ‚˜λΌ μ•„μΌλžœλ“œ(DFS)

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

πŸ“Œ 06 - μ„¬λ‚˜λΌ μ•„μΌλžœλ“œ(DFS ν™œμš©)

N*N의 μ„¬λ‚˜λΌ μ•„μΌλžœλ“œμ˜ 지도가 격자판의 μ •λ³΄λ‘œ 주어진닀. 각 섬은 1둜 ν‘œμ‹œλ˜μ–΄ μƒν•˜μ’Œμš°μ™€ λŒ€κ°μ„ μœΌλ‘œ μ—°κ²°λ˜μ–΄ 있으며, 0은 바닀이닀. μ„¬λ‚˜λΌ μ•„μΌλžœλ“œμ— λͺ‡ 개의 섬이 μžˆλŠ”μ§€ κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

λ§Œμ•½ μœ„μ™€ κ°™λ‹€λ©΄ μ„¬μ˜ κ°œμˆ˜λŠ” 총 5κ°œμ΄λ‹€.

 

πŸ“ 풀이 방법

미둜 탐색 λ¬Έμ œμ™€ μœ μ‚¬ν•œ λ¬Έμ œμ΄λ―€λ‘œ μ°Έκ³ ν•˜λ©΄ 쒋을 λ“―ν•˜λ‹€. 

  • 이쀑 for 문을 λŒλ©΄μ„œ 1이 λ‚˜μ˜¨λ‹€λ©΄ 섬을 λ°œκ²¬ν•œ κ²ƒμ΄λ―€λ‘œ λ°°μ—΄μ—μ„œ ν•΄λ‹Ή μ’Œν‘œλ₯Ό 0으둜 μž¬ν• λ‹Ήν•˜κ³  answer++을 ν•œλ‹€.
  • ν•΄λ‹Ή μ’Œν‘œμ— λŒ€ν•΄ DFSλ₯Ό λŒλ©΄μ„œ μƒν•˜μ’Œμš°μ™€ λŒ€κ°μ„ μœΌλ‘œ μ—°κ²°λœ μ’Œν‘œκ°€ μžˆλŠ”μ§€ νƒμƒ‰ν•œλ‹€.
  • μ—°κ²°λœ μ’Œν‘œκ°€ μžˆλ‹€λ©΄ 0으둜 재  ν• λ‹Ήν•˜κ³  μ—°κ²°λœ μ’Œν‘œλ‘œ μ΄λ™ν•œλ‹€.
  • 더 이상 μ—°κ²°λœ μ’Œν‘œκ°€ μ—†λ‹€λ©΄ DFS ν•¨μˆ˜λ₯Ό λͺ¨λ‘ μ’…λ£Œν•˜κ³  이쀑 for 문을 λŒλ©΄μ„œ μƒˆλ‘œμš΄ 섬을 μ°ΎλŠ”λ‹€.
function solution(board) {
  let answer = 0;
  let n = board.length;
  let dx = [-1, -1, 0, 1, 1, 1, 0, -1];
  let dy = [0, 1, 1, 1, 0, -1, -1, -1];

  // 이쀑 for 문을 λŒλ©΄μ„œ 섬을 μ°ΎλŠ” 쀑	
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      if (board[i][j] === 1) {
        board[i][j] = 0;
        answer++;
        DFS(i, j);
      }
    }
  }

  // DFS λŒλ©΄μ„œ μ—°κ²°λœ μ’Œν‘œλ₯Ό νƒμƒ‰ν•˜λŠ” 쀑
  function DFS(x, y) {
    for (let k = 0; k < 8; k++) {
      let nx = x + dx[k];
      let ny = y + dy[k];

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

  return answer;
}

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

console.log(solution(arr));