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

1 minute read

문제 설명

블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 프렌즈4블록. 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다.
/* 중략 */
입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.

제한사항

  • 입력으로 판의 높이 m, 폭 n과 판의 배치 정보 board가 들어온다.
  • 2 ≦ n, m ≦ 30
  • board는 길이 n인 문자열 m개의 배열로 주어진다. 블록을 나타내는 문자는 대문자 A에서 Z가 사용된다.

풀이

25분

2x2 지울 공간 탐색 -> 없으면 종료하고, 있으면 지운 뒤 떨어뜨림 -> 반복 

의 과정을 구현하였다. 예시에서 2x2 공간의 모서리가 겹치는 예시를 잘 보여주었기 때문에, 예외처리에서 실수 없이 구현할 수 있었던 것 같다.

코드

// 10:40 ~ 11:06
#include <string>
#include <vector>
#include <queue>
#include <iostream>

using namespace std;

int solution(int m, int n, vector<string> board) {
    int cnt = 0;
    queue<pair<int,int>> q;
    vector<char> col;
    int x,y;
    
    while(true){
        for(int i =0; i + 1 < m; ++i){
            for(int j =0; j + 1 < n; ++j){
                if(board[i][j] == ' ') continue;
                if(board[i][j] == board[i + 1][j] && board[i][j + 1] == board[i + 1][j + 1] && board[i][j] == board[i + 1][j + 1]){
                    q.push(make_pair(i,j));
                }
            }
        }
        if(q.empty()) break;
        while(!q.empty()){
            x = q.front().first;
            y = q.front().second;
            q.pop();
            
            if(board[x][y] != ' '){
                board[x][y] = ' ';
                ++cnt;
            }
            if(board[x + 1][y] != ' '){
                board[x + 1][y] = ' ';
                ++cnt;
            }
            if(board[x][y + 1] != ' '){
                board[x][y + 1] = ' ';
                ++cnt;
            }
            if(board[x + 1][y + 1] != ' '){
                board[x + 1][y + 1] = ' ';
                ++cnt;
            }
        }
        
        for(int j = 0; j < n; ++j){
            col.clear();
            for(int i = 0; i < m; ++i){
                if(board[i][j] != ' ') col.push_back(board[i][j]);
            }
            while(col.size() < m) col.insert(col.begin(),' ');
            for(int i = 0; i < m; ++i){
                board[i][j] = col[i];
            }
        }
    }
    return cnt;
}