https://programmers.co.kr/learn/courses/30/lessons/17679
문제설명
블록 깨기 게임을 기반으로 얼마나 많은 블록이 깨지는가를 return하는 문제이다.
블록이 깨지는 조건은 2*2
크기의 정사각형이 모두 같은 캐릭터일 때 이다.
블록이 깨진 후에는 남아있는 블록이 빈칸을 다 채우면서 내려온다.
내려온 후 깨질 블록이 있는지 체크한다.
이 과정을 반복하면서 더 이상 깨질 블록이 없으면 종료한다.
접근 방법
간단한 시뮬레이션 문제로 접근하였다.
깨질 블록이 있는지 탐색하는데 2*2
정사각형임을 감안하여 index를 알맞게 탐색하면 된다.
깨진 블록을 -
로 채워주면서 깨진 블록 개수를 더해준다.
-
인 블록을 만나면 while을 사용하여 index가 정상 범위일 때 까지 윗방향으로 끌어올린다.
위 과정을 do-while로 반복하면서 더 이상 깨질 블록이 없으면 종료한다.
#include <string>
#include <vector>
using namespace std;
char map[31][31];
int solution(int m, int n, vector<string> board) {
int answer = 0;
int new_ans = 0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
map[i][j] = board[i][j];
}
}
do{
answer = new_ans;
bool phang[31][31] = {false, }; // 깨질 블록을 채크할 변수
// 깨질 블록 체크하기
for(int i=0;i<m-1;i++){
for(int j=0;j<n-1;j++){
char tmp = map[i][j];
if(tmp == '-')continue;
if(tmp == map[i+1][j] && tmp == map[i][j+1] && tmp == map[i+1][j+1]){
phang[i][j] = true;
phang[i+1][j] = true;
phang[i][j+1] = true;
phang[i+1][j+1] = true;
}
}
}
// 블록 깨트리기
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(phang[i][j]){
map[i][j]='-';
new_ans++;
}
}
}
// 남은 블록 내리기
for(int i=1;i<m;i++){
for(int j=0;j<n;j++){
if(map[i][j]=='-'){
int t = i;
while(t>0){
map[t][j] = map[t-1][j];
map[t-1][j] = '-';
t--;
}
}
}
}
}while(answer != new_ans);
return answer;
}