테케 5번만 안풀리길래 뭐지 했는데 checkBoard
에서 빈 칸일 때 continue 해줘야하는 걸, break 함..ㅋㅋ
v
에 초기화 해주고, while문을 돌려서 checkBoard
가 true
일 때 계속 반복해준다.checkBoard
는 터질 블럭이 있는지 체크하는 함수set
인 erase
에 추가한다. (중복 블럭이 있을 수 있으니 바로 지우면 안됨)eraseBlock
은 블럭을 지우고 위에 있는 블럭들을 내리는 함수erase
를 돌면서 answer++
해주고, 빈 칸으로 만들어준다.erase
는 참조로 했기 때문에 clear
를 잊지 않도록 한다.#include <string>
#include <vector>
#include <set>
using namespace std;
int answer = 0;
void eraseBlock(vector<vector<char>> &v, set<pair<int,int>> &erase)
{
for(auto u:erase) // 지워질 블럭 '0'으로 체크
{
answer++;
v[u.first][u.second] = '0';
}
for(int i=0;i<v.size()-1;i++)
{
for(int j=0;j<v[i].size();j++)
{
if(v[i+1][j] == '0') // 밑에 있는게 지워질 블럭이라면
{
for(int k=i;k>=0;k--)
{
if(v[k][j] == '0') break;
v[k+1][j] = v[k][j];
v[k][j]='0';
}
}
}
}
}
bool checkBoard(vector<vector<char>> &v, set<pair<int,int>> &erase) // 터질 블럭이 있는지 체크
{
bool flag = false;
for(int i=0;i<v.size()-1;i++)
{
for(int j=0;j<v[i].size()-1;j++)
{
if(v[i][j] == '0') continue;
if(v[i][j] == v[i][j+1] && v[i][j] == v[i+1][j] && v[i][j] == v[i+1][j+1])
{
erase.insert({i, j});
erase.insert({i, j+1});
erase.insert({i+1, j});
erase.insert({i+1, j+1});
flag = true;
}
}
}
return flag;
}
int solution(int m, int n, vector<string> board) {
vector<vector<char>> v(m, vector<char>(n));
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
v[i][j] = board[i][j];
}
}
set<pair<int,int>> erase;
while(checkBoard(v, erase)) // 지울 블럭이 있다면
{
eraseBlock(v, erase); // 지우기
erase.clear();
}
return answer;
}
유익한 글이었습니다.