단순 구현 문제이다. 블록이 떨어질 때만 잘 고려해주면 된다. (이 부분을 틀리면 5,10번 TC를 틀린다. 아마도 쭉 밑으로 떨어져야하는데 이 부분에서 실수했을 확률이 높다)
코드는 다음과 같다.
#include <string>
#include <vector>
#include <queue>
using namespace std;
bool is_same_block(char a, char b, char c, char d)
{
if(a == 'a' || b == 'a' || c == 'a' || d == 'a')
return false;
if(a == b && a == c && a == d)
return true;
return false;
}
int solution(int n, int m, vector<string> board) {
int answer = 0;
while(1) {
vector<vector<int>> m1(n, vector<int>(m, 0));
bool is_continue = false;
for(int i=0;i<n-1;i++) {
for(int j=0;j<m-1;j++) {
if(is_same_block(board[i][j], board[i][j+1], board[i+1][j], board[i+1][j+1])) {
m1[i][j] = 1;
m1[i][j+1] = 1;
m1[i+1][j] = 1;
m1[i+1][j+1] = 1;
is_continue = true;
}
}
}
if(!is_continue)
break;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(m1[i][j]) {
board[i][j] = 'a';
answer++;
}
for(int j=0;j<m;j++) {
queue<char> q;
int cnt = 0;
for(int i=n-1;i>=0;i--) {
if(board[i][j] == 'a') {
cnt++;
continue;
}
q.push(board[i][j]);
}
for(int i=n-1;i>=0;i--) {
if(q.empty())
break;
board[i][j] = q.front(); q.pop();
}
for(int i=0;i<cnt;i++)
board[i][j] = 'a';
}
}
return answer;
}
```