프렌즈 4블록 자바스크립트

HyosikPark·2020년 11월 29일
0

알고리즘

목록 보기
51/72
function solution(m, n, board) {
    
    board = board.map(e => e.split(''));
    while(true) {
    let index = [];
    
    for(let i = 1; i<m; i++) {
        for (let j = 1; j<n; j++) {
            if(board[i][j] && 
               board[i][j] == board[i][j-1] 
               && board[i][j] == board[i-1][j] 
               && board[i][j] == board[i-1][j-1]) {
                index.push([i,j]);
            }
        }
    }
        if(!index.length) return board.flat().reduce((acc,e) => e ? acc : acc+1 ,0)
    index.forEach((e) => {
        let row = e[0];
        let column = e[1];
        
        board[row][column] = 0;
        board[row-1][column] = 0;
        board[row][column-1] = 0;
        board[row-1][column-1] = 0;
    })
    
     // 마지막 반복문 이해하기.
    for(let i = m-1; i>0; i--) {
        for(let j = 0; j<n; j++) {
            if(!board[i][j]) {
                
                for(let k = i-1; k>=0; k--) {
                    if(board[k][j]) {
                        board[i][j] = board[k][j];
                        board[k][j] = 0;
                        break;
                    }
                }
            }
        }
    }
  }
}

먼저 배열을 2차원 배열로 만든다.
반복문으로 제거해야할 블록의 인덱스를 찾는다.
이때 나중에 0으로 바뀐 블록들도 찾아내기 때문에 행렬이 0이 아니어야 한다는 조건을 추가. (board[i][j])
제거해야할 블록을 모두 0으로 바꾼다.
여기까지는 쉽다.
마지막 반복문은 이해하고나면 쉽지만 모르면 어렵다.
우선 2차원 배열의 마지막 행부터 모든 열을 조사하면서 2행(index = 1)까지만 조사한다.
조사하면서 그 행렬이 0을 가지고 있을 경우! 같은 열의 위쪽 행을 순차적으로 조사하면서 0을 가지고 있지 않은 행렬을 찾아낸다(k 반복문 부분)
그 행렬과 현재 0을 가진 행렬을 바꿔치기한다. 그리고 꼭 break를 걸어야 바꿔친 후에 또 다른 행렬과 바꿔치기하는 경우를 방지할 수 있다.

이 과정 전체를 while문으로 묶는다.
블록이 떨어지고 난 후 또 제거되어야 할 인덱스들이 생성되어 있는지 조사해야하기 때문이다.
반복조사를 하는 중에 파괴해야할 인덱스가 없다면?(index.length = 0) board가 가지고 있는 0의 개수(파괴된 블록 개수)를 반환한다.

0개의 댓글