[2018 KAKAO BLIND RECRUITMENT] [1차]프렌즈4블록 - C++

level2

Posted by dongjune on December 26, 2020

문제

[1차] 프렌즈4블록

풀이

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;
}