없애야 할 블록을 어떻게 판별할지, 블록을 어떤 방법으로 내릴 지를 빠르게 파악하는 것이 중요했다. 추가적으로 문제에서 주어진 String[] 배열을 그대로 사용할 경우, board의 각 칸을 확인할 때 charAt 메서드를 사용해야 하는데, 코드 가독성이 떨어지고 번거로워서 char 배열로 변환하여 사용했다.
import java.util.*;
class Solution {
static char[][] blocks;
static boolean[][] check(int m, int n) {
boolean[][] result = new boolean[m][n];
for(int i=0; i<m-1; i++) {
for(int j=0; j<n-1; j++) {
if(blocks[i][j]=='x') continue;
if(blocks[i][j]==blocks[i][j+1] && blocks[i][j]==blocks[i+1][j]
&& blocks[i][j]==blocks[i+1][j+1]) {
result[i][j] = true;
result[i][j+1] = true;
result[i+1][j] = true;
result[i+1][j+1] = true;
}
}
}
return result;
}
static void drop(int m, int n, boolean[][] result) {
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(result[i][j]) blocks[i][j]='x';
}
}
for(int i=m-1; i>=0; i--) {
for(int j=0; j<n; j++) {
if(blocks[i][j]=='x') {
int r = i;
while(r>0) {
r--;
if(blocks[r][j]!='x') break;
}
blocks[i][j] = blocks[r][j];
blocks[r][j] = 'x';
}
}
}
}
public int solution(int m, int n, String[] board) {
int answer = 0;
blocks = new char[m][n];
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
blocks[i][j] = board[i].charAt(j);
}
}
while(true) {
boolean[][] result = check(m,n);
int cnt = 0;
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(result[i][j]) cnt++;
}
}
if(cnt==0) break;
answer+=cnt;
drop(m,n,result);
}
return answer;
}
}
없애야 할 블록을 판별하는 방법
블록을 없앤 뒤 빈 칸을 내리는 방법