프로그래머스 - [1차] 프렌즈4블록

well-life-gm·2021년 12월 19일
0

프로그래머스

목록 보기
89/125

프로그래머스 - [1차] 프렌즈4블록
그림1

단순 구현 문제이다. 블록이 떨어질 때만 잘 고려해주면 된다. (이 부분을 틀리면 5,10번 TC를 틀린다. 아마도 쭉 밑으로 떨어져야하는데 이 부분에서 실수했을 확률이 높다)

코드는 다음과 같다.

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

using namespace std;

bool is_same_block(char a, char b, char c, char d)
{
    if(a == 'a' || b == 'a' || c == 'a' || d == 'a')
        return false;
    
    if(a == b && a == c && a == d)
        return true;
    
    return false;
}
int solution(int n, int m, vector<string> board) {
    int answer = 0;
    while(1) {
        vector<vector<int>> m1(n, vector<int>(m, 0));
        bool is_continue = false;
        for(int i=0;i<n-1;i++) {
            for(int j=0;j<m-1;j++) {
                if(is_same_block(board[i][j], board[i][j+1], board[i+1][j], board[i+1][j+1])) {
                    m1[i][j] = 1;
                    m1[i][j+1] = 1;
                    m1[i+1][j] = 1;
                    m1[i+1][j+1] = 1;
                    is_continue = true;
                }
            }
        }
        
        if(!is_continue)
            break;
        
        for(int i=0;i<n;i++) 
            for(int j=0;j<m;j++) 
                if(m1[i][j]) {
                    board[i][j] = 'a';
                    answer++;
                }
        
        for(int j=0;j<m;j++) {
            queue<char> q;
            int cnt = 0;
            for(int i=n-1;i>=0;i--) {
                if(board[i][j] == 'a') {
                    cnt++;
                    continue;
                }
                q.push(board[i][j]);
            }
            for(int i=n-1;i>=0;i--) {
                if(q.empty())
                    break;
                board[i][j] = q.front(); q.pop();
            }
            for(int i=0;i<cnt;i++) 
                board[i][j] = 'a';
        }
    }
    
    return answer;
}

결과```

profile
내가 보려고 만든 블로그

0개의 댓글