https://school.programmers.co.kr/learn/courses/30/lessons/17679
구현 아이디어 5분 구현 30분
#include <string>
#include <vector>
using namespace std;
char check[30][30];
int dr[3] = {0, 1, 1};
int dc[3] = {1, 1, 0};
int solution(int m, int n, vector<string> board) {
int answer = 0;
while(true)
{
bool end = true;
for(int i = 0; i < m - 1; ++i)
for(int j = 0; j < n - 1; ++j)
{
char cur_char = board[i][j];
if(cur_char == '0') continue;
bool flag = true;
for(int k = 0; k < 3; ++k)
{
int check_r = i + dr[k];
int check_c = j + dc[k];
if(cur_char != board[check_r][check_c])
{
flag = false;
break;
}
}
if(!flag) continue;
end = false;
check[i][j] = 1;
for(int k = 0; k < 3; ++k)
{
int check_r = i + dr[k];
int check_c = j + dc[k];
check[check_r][check_c] = 1;
}
}
if(end) break;
for(int i = 0; i < m; ++i)
for(int j = 0; j < n; ++j)
if(check[i][j])
{
// 얘가 1이면 삭제될 블록.
// 원본을 알파벳이 아닌 다른 값으로 대입하기.
++answer;
board[i][j] = '0';
}
// 블록 내리기.
for(int i = m - 2; i >= 0; --i)
{
for(int j = 0; j < n; ++j)
{
char cur_char = board[i][j];
int check_i = i + 1;
while(true)
{
if(check_i == m) break;
if(board[check_i][j] == '0')
{
++check_i;
}
else break;
}
char change = board[i][j];
board[i][j] = board[check_i - 1][j];
board[check_i - 1][j] = change;
}
}
// check 배열 초기화.
for(int i = 0; i < m; ++i)
for(int j = 0; j < n; ++j)
check[i][j] = 0;
}
return answer;
}