😀과정
- 세로 축을 확인(블록 낙하 가능여부)하는
canFill
함수 정의
- 배열을 탐색하며 목표 블록의 영역 확인 (
minX
, maxX
, minY
, maxY
)
- 해당 영역의 블록 낙하 유효성 검사
3-1. 다른 블록이 목표 영역과 겹쳐있진 않은가?
3-2. 블록 낙하 도중 장애물과 충돌하진 않는가?
- 가능하다면, 해당 영역을 모두 빈 칸으로 전환 후
count++
- 더이상 아무 블록도 제거할 수 없을 때까지 반복
😁풀이
function solution(board) {
const N = board.length;
let answer = 0;
function canFill(y, x) {
for (let i = 0; i < y; i++) {
if (board[i][x] !== 0) return false;
}
return true;
}
function checkRemove() {
let count = 0;
for (let i = 0; i < N; i++) {
for (let j = 0; j < N; j++) {
if (board[i][j] !== 0) {
const target = board[i][j];
let minX = N, maxX = -1, minY = N, maxY = -1;
for (let x = 0; x < N; x++) {
for (let y = 0; y < N; y++) {
if (board[x][y] === target) {
minX = Math.min(minX, x);
maxX = Math.max(maxX, x);
minY = Math.min(minY, y);
maxY = Math.max(maxY, y);
}
}
}
let canRemove = true;
for (let x = minX; x <= maxX; x++) {
for (let y = minY; y <= maxY; y++) {
if (board[x][y] !== 0 && board[x][y] !== target) {
canRemove = false;
break;
}
if (board[x][y] === 0 && !canFill(x, y)) {
canRemove = false;
break;
}
}
if (!canRemove) break;
}
if (canRemove) {
for (let x = minX; x <= maxX; x++) {
for (let y = minY; y <= maxY; y++) {
board[x][y] = 0;
}
}
count++;
}
}
}
}
return count;
}
while (true) {
let removed = checkRemove();
if (removed === 0) break;
answer += removed;
}
return answer;
}