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의 개수(파괴된 블록 개수)를 반환한다.