알고리즘/PS - 프로그래머스

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

excited-hyun 2021. 8. 2. 16:45
반응형

https://programmers.co.kr/learn/courses/30/lessons/17679

 

코딩테스트 연습 - [1차] 프렌즈4블록

프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙

programmers.co.kr

 

풀이

차례로 board를 탐색하면서 블록을 지워가면 되는 문제입니다.

제거할 수 있는 블록을 찾으면서 동시에 제거해버리면 그 블록과 겹치게 4블록이 생성되는 경우 제대로 풀이되지 않습니다. 

따라서 임시로 제거할 블록을 저장할 temp 벡터를 하나만들고, 제거할 블록을 찾은 후에 블록을 제거해주어야 합니다.

또한 블록을 제거한 후에는 그 빈부분이 채워지도록 위의 블록을 아래로 내려주어야 합니다.

 

#include <string>
#include <vector>

using namespace std;

int solution(int m, int n, vector<string> board) {
    int answer = 0;
    bool del;
    vector<string> temp;
    temp.resize(board.size());
    copy(board.begin(), board.end(), temp.begin());
    
    while(1){
        copy(board.begin(), board.end(), temp.begin());
        del = false;
        
        //제거 가능한 블록 찾기
        for(int i=0; i<m-1; i++){
            for(int j=0; j<n-1; j++){
                if(board[i][j] == '.')
                    continue;
                
                //4블록!->삭제
                if(board[i][j] == board[i][j+1] && board[i][j] == board[i+1][j] && board[i][j] == board[i+1][j+1]){
                    temp[i][j] = '.';
                    temp[i][j+1] = '.';
                    temp[i+1][j] = '.';
                    temp[i+1][j+1] = '.';
                    del = true;
                }
            }
        }
        
        //더이상 제거 불가 -> while문 종료
        if(del == false)
            break;
        
        //board에 빈칸 표시
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (temp[i][j] == '.') {
                    board[i][j] = '.';
                }
            }
        }
        
        //블록 내리기
        for (int i = 1; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] == '.') {
                    for (int k = i; k > 0; k--) {
                        if (board[k - 1][j] == '.')
                            break;
                        board[k][j] = board[k - 1][j];
                        board[k - 1][j] = '.';
                    }
                }
            }
        }

    }
    
    //삭제된 블록 모두 세기
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (board[i][j] == '.') {
                answer++;
            }
        }
    }

    return answer;
}
728x90
반응형