[프로그래머스] 블록 게임

Chobby·2024년 4월 9일
1

Programmers

목록 보기
345/345

😀과정

  1. 세로 축을 확인(블록 낙하 가능여부)하는 canFill 함수 정의
  2. 배열을 탐색하며 목표 블록의 영역 확인 (minX, maxX, minY, maxY)
  3. 해당 영역의 블록 낙하 유효성 검사
    3-1. 다른 블록이 목표 영역과 겹쳐있진 않은가?
    3-2. 블록 낙하 도중 장애물과 충돌하진 않는가?
  4. 가능하다면, 해당 영역을 모두 빈 칸으로 전환 후 count++
  5. 더이상 아무 블록도 제거할 수 없을 때까지 반복

😁풀이

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;
}
profile
내 지식을 공유할 수 있는 대담함

0개의 댓글