1. 문제 풀이 아이디어
- 게임의 진행 과정을 그대로 구현하여 문제를 해결할 수 있다.
2. 나의 정답 코드
import java.util.ArrayDeque;
import java.util.Queue;
class Solution {
public int solution(int m, int n, String[] board) {
int answer = 0;
char[][] map = new char[m][n];
int[][] box = {{0, 0}, {0, 1}, {1, 0}, {1, 1}};
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
map[i][j] = board[i].charAt(j);
}
}
while (true) {
Queue<int[]> queue = new ArrayDeque<>();
for (int i = 0; i < m - 1; i++) {
for (int j = 0; j < n - 1; j++) {
char cur = map[i][j];
if (cur == ' ') continue;
if (map[i + 1][j] != cur || map[i][j + 1] != cur || map[i + 1][j + 1] != cur)
continue;
queue.add(new int[]{i, j});
}
}
if (queue.isEmpty()) break;
while (!queue.isEmpty()) {
int[] cur = queue.poll();
for (int i = 0; i < 4; i++) {
int curx = cur[0] + box[i][0];
int cury = cur[1] + box[i][1];
if (map[curx][cury] == ' ')
continue;
map[curx][cury] = ' ';
answer++;
}
}
for (int i = m - 1; i >= 0; i--) {
for (int j = 0; j < n; j++) {
if (map[i][j] != ' ') continue;
int k = i - 1;
while (k >= 0 && map[k][j] == ' ') k--;
if (k < 0) continue;
map[i][j] = map[k][j];
map[k][j] = ' ';
}
}
}
return answer;
}
}
3. 정리
- 입력 데이터를 2차원 문자 배열로 변환한다.
- 배열을 순회하며 지워야 할 블록의 좌상단 좌표를 큐에 저장한다.
- 큐에서 좌표를 하나씩 꺼내 해당 블록을 빈 문자로 바꾸고, 결과값을 증가시킨다.
- 문자 배열에서 빈 문자가 있을 경우 위에서 문자를 찾아 채운다.
- 지워야 할 블록이 없으면 반복문을 종료하고 결과값을 반환한다.
Share article