🎈문제
문제링크
🎈제한사항(입력형식)
🎈접근방법
- 4칸으로 지워지는 블록을 이차원 boolean 배열(check)에 체크해준다.(바로 적용안하는 이유는 : 겹치는 부분도 있기 때문에 모든 경우를 구해야한다.)
- check배열에서 true이면 map에 '.'으로 바꿔준다. (지우는 단계)
2-1. '.'으로 바꿔주면서 바꿔준 갯수를 새고 반환해준다.
2-2 개수가 0이면 종료하고 아니면 answer에 더해준다.
- 지워진 블록을 채우기 위해서 블록들을 내려준다.
- 2-2에 0이 나올 때까지 반복한다.
🎈코드
class Solution {
static int[] dx ={1,0,1};
static int[] dy ={0,1,1};
static char[][] map;
static int M,N;
public int solution(int m, int n, String[] board) {
int answer = 0;
M = m; N = n;
map = new char[m][n];
for(int i=0; i<m; i++){
map[i] = board[i].toCharArray();
}
while(true){
boolean[][] check = new boolean[m][n];
for(int i=0; i<m-1; i++){
for(int j=0; j<n-1; j++){
if(map[i][j] == '.') continue;
blockCheck(check,i,j);
}
}
int cnt = blockDelete(check);
if(cnt==0) break;
answer+=cnt;
blockDown();
}
return answer;
}
static void blockDown(){
for(int c = 0 ; c < N ; c++) {
for(int r = M - 1 ; r >= 0 ; r--) {
if(map[r][c] == '.') {
for(int k = r - 1 ; k >= 0 ; k--) {
if(map[k][c] != '.') {
map[r][c] = map[k][c];
map[k][c] = '.';
break;
}
}
}
}
}
}
static int blockDelete(boolean[][] check){
int cnt = 0;
for(int i=0; i<M; i++){
for(int j=0; j<N; j++){
if(check[i][j]){
map[i][j] = '.';
cnt++;
}
}
}
return cnt;
}
static void blockCheck(boolean[][] check,int x, int y){
int cnt = 0;
for(int i=0; i<3; i++){
int px = x + dx[i];
int py = y + dy[i];
if(0<=px && px < M && 0<=py && py<N){
if(map[x][y] == map[px][py]){
cnt++;
}
}
}
if(cnt==3){
check[x][y] = true;
check[x+1][y] = true;
check[x][y+1] = true;
check[x+1][y+1] = true;
}
}
}