섬나라 아일랜드(DFS)

minho·2021년 12월 23일
0

코드

function solution(board){  
        let answer = 0,
            n = board.length,
            dx = [-1,-1,0,1,1,1,0,-1],
            dy = [0,1,1,1,0,-1,-1,-1];
    
        function DFS(x, y){
            board[x][y]=0;
            for(let k=0; k<8; k++){
                let nx= x+dx[k],
                    ny= y+dy[k];
                if(nx>=0 && nx<n && ny>=0 && ny<n && board[nx][ny]===1){
                    DFS(nx,ny);
                }    
            }
        }
        for(let i=0; i<n; i++){
            for(let l=0; l<n; l++){
                if(board[i][l]===1){
                    answer++;
                    DFS(i,l);
                }
            }
        }
        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));

원리

  1. 이중for문으로 board를 탐색한다.
  2. 1이 탐색되면 상하좌우,대각선에 연결되어있는 1을 모두 0으로 바꾸어준다.(DFS)
  3. answer++를 해준다.

2(DFS)
2-1. DFS(x, y)에서 board[x][y]를 0으로 바꾸어준다. [주의! 이 과정을 해주지 않으면 board의 값은 1로 남고만다.]
2-2. 위쪽 부터 시계방향으로 탐색할때 숫자가 없는 지역이 있을 수 있다.
그러므로 nx>=0 && nx<n && ny>=0 && ny<n 조건을 잊지 않는다.

profile
Live the way you think

0개의 댓글