🖇️ 문제 링크
📝 문제 분석
지워지는 조건에 만족하는 2 * 2모양이 여러 개 있다면 한꺼번에 지워진다고 했으므로, 모든 칸을 순회하면서 2 * 2 모두 같은 모양을 만족하는 칸에 표시를 합니다. ( visited[][]
)
모든 칸 순회가 끝나고, 표시해 두었던 칸들을 빈 칸으로 바꿔줍니다.
공중에 떠 있는 칸들이 있으면 아래로 내려줍니다. ( down()
)
위의 작업들을 더 이상 없앨 블록이 없어질 때까지 반복합니다.
⌨️ 코드
class Solution {
char[][] map;
public int solution(int m, int n, String[] board) {
int answer = 0;
map = new char[m][n];
for(int i = 0; i < m; i++)
map[i] = board[i].toCharArray();
while(true) {
int cnt = remove(m, n);
if(cnt == 0) break;
answer += cnt;
down(m, n);
}
return answer;
}
public int remove(int m, int n) {
int cnt = 0;
boolean[][] visited = new boolean[m][n];
for(int i = 0; i < m - 1; i++) {
for(int j = 0; j < n - 1; j++) {
char cur = map[i][j];
if(cur != '.' && cur == map[i][j + 1] && cur == map[i + 1][j] && cur == map[i + 1][j + 1]) {
visited[i][j] = true;
visited[i][j + 1] = true;
visited[i + 1][j] = true;
visited[i + 1][j + 1] = true;
}
}
}
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(visited[i][j]) {
cnt++;
map[i][j] = '.';
}
}
}
return cnt;
}
public void down(int m, int n) {
for(int k = 0; k < m; k++){
for(int i = m - 1; i > 0; i--){
for(int j = 0; j < n; j++){
if(map[i][j] =='.' && map[i - 1][j] != '.'){
map[i][j] = map[i - 1][j];
map[i - 1][j] = '.';
}
}
}
}
}
}
Uploaded by Notion2Tistory v1.1.0