[Programmers] [1차] 프렌즈4블록

Date:

[Programmers] [1차] 프렌즈4블록

Problem URL : [1차] 프렌즈4블록

#include <string>
#include <vector>
#include <queue>

using namespace std;

int M, N;
vector<vector<bool>> v;
int solution(int m, int n, vector<string> board);
bool check(int i, int j, vector<string> &board);
void erase(vector<string> &board);

int solution(int m, int n, vector<string> board) {
    M = m;
    N = n;
    int answer = 0;
    bool flag = false;
    while (!flag) {
        v = vector<vector<bool>>(m, vector<bool>(n, false)); // false로 초기화
        for (int i = 0; i < M - 1; i++) {
            for (int j = 0; j < N - 1; j++) {
                if (board[i][j] == 'x') 
                    continue;
                if (check(i, j, board))
                    flag = true;
            }
        }
        if (!flag) break;
        erase(board); // check 해놓은 블록들을 한번에 지운다.
        flag = false;
    }

    //answer계산
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (board[i][j] == 'x')
                answer++;
        }
    }

    return answer;
}

//지울 블럭이 있으면 true, 없으면 false 반환
//지울 블럭들을 v에 체크한다.
bool check(int i, int j, vector<string> &board) {
    if(board[i][j] == board[i][j + 1] && board[i][j] == board[i + 1][j] && board[i][j] == board[i + 1][j + 1]) {
        v[i][j] = v[i+1][j] = v[i][j+1] = v[i+1][j+1] = 'x';
        return true;
    }
    return false;
}

void erase(vector<string> &board) {
    for(int a = 0; a < N; a++) {
        queue<int> q;
        for(int b = M - 1; b >= 0; b--) {
            if(!v[b][a]) {
                q.push(board[b][a]); // 지워진 블록을 제외하고 아래부터 순서대로 q에 넣는다.
            }
        }
        for(int b = M - 1; b >= 0; b--) {
            // 살아남은 블록들인 q로부터 board의 아래부터 다시 쌓아준다.
            if(q.empty()){
                board[b][a] = 'x';
            }else{
                board[b][a] = q.front();
                q.pop();
            }
        }
    }
}

댓글