λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm/μΈν”„λŸ°(inflearn)

[ μžλ°”μŠ€ν¬λ¦½νŠΈ(JavaScript) ] section09 - 6 - μ„¬λ‚˜λΌμ•„μΌλžœλ“œ(DFS, BFS)

by YWTechIT 2021. 10. 12.
728x90

πŸ“ section09 - 6 - μ„¬λ‚˜λΌ μ•„μΌλžœλ“œ(BFS, DFS)

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

 

 

이 λ¬Έμ œλŠ” DFS 와 BFSνƒμƒ‰μœΌλ‘œ λͺ¨λ‘ ν’€ 수 μžˆλŠ” λ¬Έμ œλ‹€. 이 방법을 μ΄μš©ν•˜λ©΄ λ°±μ€€4963 - μ„¬μ˜ κ°œμˆ˜λ„ ν•œλ²ˆ ν’€μ–΄λ³΄μž! λ¨Όμ €, DFS둜 ν‘ΈλŠ” 방법을 μ•Œμ•„λ³΄μž.

 

  1. visited 배열을 μ„ μ–Έν•˜μ§€ μ•Šκ³  ν˜„μž¬ μ’Œν‘œλ₯Ό 0으둜 λ§Œλ“  λ‹€μŒμ— λŒ€κ°μ„  μ’Œν‘œμ˜ 값이 1인 곳만 νƒμƒ‰ν•œλ‹€.(μ΄λ•Œ, μž¬κ·€μ μœΌλ‘œ dfs ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.)
  2. boardλ₯Ό λŒλ©΄μ„œ ν˜„μž¬ μ’Œν‘œμ™€ λŒ€κ°μ„  μ’Œν‘œκΉŒμ§€ 0이면 더 이상 탐색할 수 μ—†μœΌλ―€λ‘œ λ‹€μŒ μ’Œν‘œλ‘œ λ„˜μ–΄κ°„λ‹€. λ„˜μ–΄κ°ˆ λ•Œ cnt 증가

 

// DFS
let n = 7;
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(n, arr));

function solution(n, arr){
  let dx = [-1, -1, 0, 1, 1, 1, 0, -1];
  let dy = [0, 1, 1, 1, 0, -1, -1, -1];
  let cnt=0;

  function dfs(x, y){
    console.log(`x=${x}, y=${y}`)
    arr[x][y]=0;
    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) continue;
      if(arr[nx][ny]) dfs(nx, ny);
    }
  }

  for(let x=0; x<n; x++){
    for(let y=0; y<n; y++){
      if (arr[x][y]){
        dfs(x, y);
        cnt++;
      }
    }
  }
  return cnt;
}

πŸ‘‰πŸ½ 5

 

728x90

 

λ‹€μŒμœΌλ‘œ, BFS둜 ν‘ΈλŠ” 방법을 μ•Œμ•„λ³΄μž.

 

  1. visited 배열을 μ„ μ–Έν•˜μ§€ μ•Šκ³  ν˜„μž¬ μ’Œν‘œλ₯Ό 0으둜 λ§Œλ“  λ‹€μŒμ— λŒ€κ°μ„  μ’Œν‘œμ˜ 값이 1인 곳만 νƒμƒ‰ν•œλ‹€. λŒ€κ°μ„  μ’Œν‘œκ°€ 1이면 queue에 λ„£λŠ”λ‹€.
  2. queue값이 shift 될 λ•Œ 또 λŒ€κ°μ„  μ’Œν‘œλ₯Ό μ‚΄νŽ΄λ³Έλ‹€. λŒ€κ°μ„  μ’Œν‘œκ°€ 1이면 queue에 λ„£κ³  0이면 continueν•œλ‹€.
  3. boardλ₯Ό λŒλ©΄μ„œ ν˜„μž¬ μ’Œν‘œμ™€ λŒ€κ°μ„  μ’Œν‘œκΉŒμ§€ 0이면 더 이상 탐색할 수 μ—†μœΌλ―€λ‘œ λ‹€μŒ μ’Œν‘œλ‘œ λ„˜μ–΄κ°„λ‹€. λ„˜μ–΄κ°ˆ λ•Œ cnt 증가

 

// BFS
let n = 7;
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(n, arr));

function solution(n, arr){
  let dx = [-1, -1, 0, 1, 1, 1, 0, -1];
  let dy = [0, 1, 1, 1, 0, -1, -1, -1];
  let cnt=0;
  let queue=[];

  function bfs(x, y){
    arr[x][y]=0;
    queue.push([x, y]);

    while(queue.length){
      let [x, y] = queue.shift();
      console.log(`x=${x}, y=${y}`)
      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) continue;
        if(arr[nx][ny]){
          arr[nx][ny]=0;
          queue.push([nx, ny])
        }
      }
    }
  }

  for(let x=0; x<n; x++){
    for(let y=0; y<n; y++){
      if (arr[x][y]){
        bfs(x, y);
        cnt++;
      }
    }
  }
  return cnt;
}

πŸ‘‰πŸ½ 5
λ°˜μ‘ν˜•

λŒ“κΈ€