[프로그래머스] 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}});
}
}
댓글남기기