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

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

_μ„±ν˜Έ_ 2022. 11. 28. 14:23
728x90
λ°˜μ‘ν˜•

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

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

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

 

μ„¬λ‚˜λΌ μ•„μΌλžœλ“œ(DFS) λ¬Έμ œμ™€ κ°™μ§€λ§Œ μ΄λ²ˆμ—λŠ” BFS μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•΄ ν’€μ–΄λ³΄μ•˜λ‹€. μ˜μ—­μ„ νƒμƒ‰ν•˜λŠ” 문제의 κ²½μš°μ—λŠ” λ³ΈμΈμ—κ²Œ νŽΈν•œ 방법을 μ΄μš©ν•˜μ—¬ ν’€λ©΄ 될 것 κ°™λ‹€..πŸ€”

 

πŸ“ 풀이 방법

  • 이쀑 for 문을 λŒλ©΄μ„œ 1이 λ‚˜μ˜¨λ‹€λ©΄ 섬을 λ°œκ²¬ν•œ κ²ƒμ΄λ―€λ‘œ λ°°μ—΄μ—μ„œ ν•΄λ‹Ή μ’Œν‘œλ₯Ό 0으둜 μž¬ν• λ‹Ήν•˜κ³  answer++을 ν•œλ‹€. λ˜ν•œ, 넓이 μš°μ„  탐색을 μœ„ν•΄ 큐에 ν•΄λ‹Ή μ’Œν‘œλ₯Ό μΆ”κ°€ν•œλ‹€.
  • while 문을 λŒλ©΄μ„œ νμ—μ„œ shift ν•œ μ’Œν‘œμ— λŒ€ν•΄ μƒν•˜μ’Œμš°μ™€ λŒ€κ°μ„ μ„ νƒμƒ‰ν•˜μ—¬ μ—°κ²°λœ μ’Œν‘œκ°€ μžˆλ‹€λ©΄ λͺ¨λ‘ 0으둜 μž¬ν• λ‹Ήν•˜κ³  큐에 μΆ”κ°€ν•œλ‹€.
  • μœ„μ™€ 같은 과정을 λ°˜λ³΅ν•˜λ‹€κ°€ 큐에 아무것도 μ‘΄μž¬ν•˜μ§€ μ•Šμ•„ while 문을 λΉ μ Έλ‚˜μ˜¨λ‹€λ©΄ ν•˜λ‚˜μ˜ 섬을 λͺ¨λ‘ νƒμƒ‰ν•œ κ²ƒμ΄λ―€λ‘œ λ‹€λ₯Έ 섬을 μ°ΎλŠ”λ‹€.
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];
  let queue = [];

  // 섬을 μ°ΎλŠ” κ³Όμ •
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      if (board[i][j] === 1) {
        // λ¨Όμ € 0으둜 μ²΄ν¬ν•œ ν›„ 큐에 μΆ”κ°€
        board[i][j] = 0;
        queue.push([i, j]);
        answer++;

        // ν•˜λ‚˜μ˜ 섬을 λ°œκ²¬ν•˜μ—¬ 주변을 νƒμƒ‰ν•˜λŠ” κ³Όμ •
        while (queue.length) {
          let [x, y] = queue.shift();

          for (let i = 0; i < 8; i++) {
            let nx = x + dx[i];
            let ny = y + dy[i];

            // 경계선 확인 ν•„μˆ˜ ❗
            if (nx < 0 || ny < 0 || nx >= n || ny >= n || board[nx][ny] === 0)
              continue;

            board[nx][ny] = 0;
            queue.push([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));