문제 링크
프렌즈4블록
풀이
- 문제 접근부터 굉장히 헷갈렸다. 이게 BFS인지, 완전탐색인지...헷갈렸기 때문
- 복잡한 문제일수록 간단하게 생각하면 쉽다...를 다른 사람이 풀어놓은 것을 보고 깨달았다.
- 전체 탐색을 하면서, 2x2 블록을 탐색하고 조건에 부합한다면 그 부분만 다른 배열에 표시해 둔 다음, 전체 탐색이 끝난 뒤에 해당되는 부분은 지우고, 배열을 아래로 땡겨오면 된다.
- 그 다음에는 지워지지 않은 부분에 대한 전체 탐색을 다시 시작하면 된다.
import java.util.LinkedList;
import java.util.Queue;
class Solution {
static boolean[][] v;
public int solution(int m, int n, String[] board) {
int answer = 0;
char[][] copy = new char[m][n];
for (int i = 0; i < m; i++) {
copy[i] = board[i].toCharArray();
}
boolean flag = true;
while (flag) {
v = new boolean[m][n];
flag = false;
for (int i = 0; i < m - 1; i++) {
for (int j = 0; j < n - 1; j++) {
if (copy[i][j] == '#') continue;
if (check(i, j, copy)) {
v[i][j] = true;
v[i][j + 1] = true;
v[i + 1][j] = true;
v[i + 1][j + 1] = true;
flag = true;
}
}
}
answer += sortingArr(m, n, copy);
v = new boolean[m][n];
}
return answer;
}
public static boolean check(int x, int y, char[][] board) {
char ch = board[x][y];
return ch == board[x][y + 1] && ch == board[x + 1][y] && ch == board[x + 1][y + 1];
}
public static int sortingArr(int m, int n, char[][] board) {
int cnt = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (v[i][j])
board[i][j] = '.';
}
}
for (int i = 0; i < n; i++) {
Queue<Character> q = new LinkedList<>();
for (int j = m - 1; j >= 0; j--) {
if (board[j][i] == '.') {
cnt++;
} else {
q.add(board[j][i]);
}
}
int idx = m - 1;
while (!q.isEmpty()) {
board[idx--][i] = q.poll();
}
for (int j = idx; j >= 0; j--) {
board[j][i] = '#';
}
}
return cnt;
}
}