문제
풀이
while 문을 돌면서 지울 수 있는 블록들의 위치 좌표를 모두 큐에 넣어줬습니다.
그리고 큐를 비우면서 지우는 블록의 개수를 카운트 해줬습니다.
지우고 난 후 빈 공간의 블록을 채우는 것은 3중 for문으로 구현해줬습니다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <string>
#include <vector>
#include <queue>
using namespace std;
struct Pos{
int y,x;
};
int dy[4]={0,0,-1,-1};
int dx[4]={0,-1,0,-1};
// 지워진 블록의 빈 공간을 채우기
void fall(int m, int n,vector<string> &board){
for(int c=0;c<n;c++){
for(int r=m-1;r>0;r--){
if(board[r][c]=='*'){
for(int k=r-1;k>=0;k--){
if(board[k][c]!='*'){
board[r][c]=board[k][c];
board[k][c]='*';
break;
}
}
}
}
}
}
int solution(int m, int n, vector<string> board) {
int answer = 0;
queue<Pos> q;
while(true){
while(!q.empty()){
Pos cur = q.front();
q.pop();
// 블록 지우고 개수 세주기
for(int i=0;i<4;i++){
int ny = cur.y+dy[i];
int nx = cur.x+dx[i];
if(board[ny][nx]!='*'){
answer++;
board[ny][nx]='*';
}
}
}
// 빈 블록 채워주기
fall(m,n,board);
// 지울 수 있는 블록을 큐에 넣어주기
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(board[i][j]=='*') continue;
char cur = board[i][j];
if(cur==board[i-1][j-1]&&cur==board[i-1][j]&&cur==board[i][j-1]){
q.push({i,j});
}
}
}
if(q.empty())
break;
}
return answer;
}
-
Previous
[2019 KAKAO BLIND RECRUITMENT] 뉴스 클러스터링 - C++ -
Next
[Algorithm] Selection Sort (선택 정렬) - C++