구현
1. friendsBlock
을 통해 한 사이클을 만들었다. 좀 더 살펴보면
먼저 블록의 삭제여부 확인을 위한 deleted를 만들었다.
1-1. (블록 삭제) 문제에 적힌 대로 카카오 프렌즈 블록 4개씩 붙어 있는 경우 삭제한다.
1-2. (빈공간 채우기) 각 열별로 밑에서 부터 삭제된 블록의 수를 세고 이를 통해 빈공간 위에 있는 블록들을 빈공간 만큼 아래로 움직여 빈공간을 채운다.
1-3. (점수구하기) drop의 맨 윗 행에는 각 열별로 사라진 블록의 개수가 저장되어 있으므로 맨 윗행의 drop[0]의 합을 구한다.
2. 위 1번 과정 후 얻은 점수가 0이 아니라면 다시 위 과정을 반복하여 블록을 삭제하고 점수를 얻는다.
0이라면, 더이상 점수를 얻을 수 없으므로 멈춘다.
import java.util.*;
class Solution {
public static int[] dx = {0, 1, 1};
public static int[] dy = {1, 1, 0};
public int m, n;
public int solution(int m, int n, String[] board) {
int answer = 0;
this.m = m;
this.n = n;
char[][] kakaoBoard = new char[m][n];
for (int i = 0; i < m; i++) {
kakaoBoard[i] = board[i].toCharArray();
}
int cnt = 1;
while (cnt != 0) {
cnt = friendsBlock(kakaoBoard);
answer += cnt;
}
return answer;
}
public int friendsBlock(char[][] board) {
int answer = 0;
boolean[][] deleted = new boolean[m][n];
// 카카오 프렌즈 블록 4개씩 붙어 있는 경우 삭제
for (int i = 0; i < m - 1; i++) {
for (int j = 0; j < n - 1; j++) {
boolean flag = true;
char cur = board[i][j];
if (cur == ' ') continue;
for (int k = 0; k < 3; k++) {
int newi = i + dx[k];
int newj = j + dy[k];
if (cur != board[newi][newj]) {
flag = false;
break;
}
}
if (flag) {
deleted[i][j] = true;
for (int k = 0; k < 3; k++) {
int newi = i + dx[k];
int newj = j + dy[k];
deleted[newi][newj] = true;
}
}
}
}
int[][] drop = new int[m][n];
// 블록 빈공간 채우기
dropBlock(drop, deleted, board);
// 점수 계산
return getScore(drop);
}
public void dropBlock(int[][] drop, boolean[][] deleted, char[][] board) {
for (int j = 0; j < n; j++) {
for (int i = m - 1; i >= 0; i--) {
int bef = i < m - 1 ? drop[i+1][j] : 0;
int aft = deleted[i][j] ? 1 : 0;
drop[i][j] = bef + aft;
if (!deleted[i][j] && drop[i][j] > 0) {
board[i + drop[i][j]][j] = board[i][j];
board[i][j] = ' ';
} else if (deleted[i][j]) {
board[i][j] = ' ';
}
}
}
}
public int getScore(int[][] drop) {
int score = 0;
for (int j = 0; j < n; j++) {
score += drop[0][j];
}
return score;
}
}