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

4 분 소요

문제 링크

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


풀이 과정

문제에서 제시된 위 12개의 블럭 모양 중 위와 같이 5개만 제거될 수 있습니다.


먼저, 모든 (i, j) 좌표에 대해 해당 블럭이 위와 같이 제거될 수 있는 블럭의 최상단을 이루는지를 확인합니다.


위와 같이 5개의 블럭 중 하나에 속한다면, 다음으로는 검은 블럭을 내려보내 속이 꽉 채워진 직사각형이 만들어지는지를 확인합니다. 아래 화살표로 표시된 열의 맨 위 좌표부터 해당 블럭위치까지 빈 공간인지를 검사합니다.


블럭을 제거했다면, 첫 번째 열부터 다시 위 과정을 거칩니다. 위 예시처럼 연쇄적인 제거가 이루어질 수 있기 때문에, 0번째 열부터 다시 확인을 합니다.


코드

public class Main {
    public static int solution(int[][] board) {
        int answer = 0;
        int n = board.length;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] == 0) continue;

                if (isA(i, j, board[i][j], n, board) && drop(i + 1, j + 1, board[i][j], board) && drop(i + 1, j + 2, board[i][j], board)) {
                    remove(i, j, i + 1, j, i + 1, j + 1, i + 1, j + 2, board);
                    j = -1;
                    answer++;
                } else if (isB(i, j, board[i][j], n, board) && drop(i + 2, j - 1, board[i][j], board)) {
                    remove(i, j, i + 1, j, i + 2, j, i + 2, j - 1, board);
                    j = -1;
                    answer++;
                } else if (isC(i, j, board[i][j], n, board) && drop(i + 2, j + 1, board[i][j], board)) {
                    remove(i, j, i + 1, j, i + 2, j, i + 2, j + 1, board);
                    j = -1;
                    answer++;
                } else if (isD(i, j, board[i][j], n, board) && drop(i + 1, j - 1, board[i][j], board) && drop(i + 1, j - 2, board[i][j], board)) {
                    remove(i, j, i + 1, j, i + 1, j - 1, i + 1, j - 2, board);
                    j = -1;
                    answer++;
                } else if (isE(i, j, board[i][j], n, board) && drop(i + 1, j - 1, board[i][j], board) && drop(i + 1, j + 1, board[i][j], board)) {
                    remove(i, j, i + 1, j, i + 1, j - 1, i + 1, j + 1, board);
                    j = -1;
                    answer++;
                }
            }
        }

        return answer;
    }

    static boolean isA(int x, int y, int num, int n, int[][] board) {
        if (x + 1 > n - 1 || y + 2 > n - 1) return false;
        return board[x + 1][y] == num && board[x + 1][y + 1] == num && board[x + 1][y + 2] == num;
    }

    static boolean isB(int x, int y, int num, int n, int[][] board) {
        if (x + 2 > n - 1 || y - 1 < 0) return false;
        return board[x + 1][y] == num && board[x + 2][y] == num && board[x + 2][y - 1] == num;
    }

    static boolean isC(int x, int y, int num, int n, int[][] board) {
        if (x + 2 > n - 1 || y + 1 > n - 1) return false;
        return board[x + 1][y] == num && board[x + 2][y] == num && board[x + 2][y + 1] == num;
    }

    static boolean isD(int x, int y, int num, int n, int[][] board) {
        if (x + 1 > n - 1 || y - 2 < 0) return false;
        return board[x + 1][y] == num && board[x + 1][y - 1] == num && board[x + 1][y - 2] == num;
    }

    static boolean isE(int x, int y, int num, int n, int[][] board) {
        if (x + 1 > n - 1 || y - 1 < 0 || y + 1 > n - 1) return false;
        return board[x + 1][y] == num && board[x + 1][y - 1] == num && board[x + 1][y + 1] == num;
    }

    static boolean drop(int x, int y, int num, int[][] board) {
        for (int i = 0; i < x; i++)
            if (board[i][y] != 0) return false;
        return true;
    }

    static void remove(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int[][] board) {
        board[x1][y1] = board[x2][y2] = board[x3][y3] = board[x4][y4] = 0;
    }

    public static void main(String[] args) {
        solution(new int[][]{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 4, 0, 0, 0}, {0, 0, 0, 0, 0, 4, 4, 0, 0, 0}, {0, 0, 0, 0, 3, 0, 4, 0, 0, 0}, {0, 0, 0, 2, 3, 0, 0, 0, 5, 5}, {1, 2, 2, 2, 3, 3, 0, 0, 0, 5}, {1, 1, 1, 0, 0, 0, 0, 0, 0, 5}});
    }
}

카테고리:

업데이트:

댓글남기기