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

1 분 소요

1.문제 링크

[1차] 프렌즈4블록



2. 풀이 전 계획과 생각

  • 구현하기



3. 풀이

#include <string>
#include <vector>
using namespace std;

void setFalse(bool **check, int m, int n){
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            check[i][j]= false;
        }
    }
}

bool IsErase(vector<string> &board, bool **check, int m, int n){
    char sc = board[m][n];
    if(sc=='z') return false;
    if(sc==board[m-1][n] && sc==board[m-1][n+1] &&
        sc==board[m][n+1]){
        check[m-1][n]= true;
        check[m-1][n+1]= true;
        check[m][n+1]= true;
        check[m][n]= true;
        return true;
    }
    else return false;
}

int erase(vector<string> &board, bool **check, int m , int n){
    int cnt=0;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(check[i][j]) {
                board[i][j]='z';
                cnt++;
            }
        }
    }
    return cnt;
}

void downBlock(vector<string> &board, int m, int n){
    vector<char> v;
    for(int i=0;i<n;i++){
        for(int j=m-1;j>=0;j--){
            if(board[j][i]!='z'){
                v.push_back(board[j][i]);
            }
        }
        if(v.size()!=0){
            int cnt=m-1;
            for(int j=0;j<v.size();j++){
                board[cnt--][i]=v[j];
            }
            for(int j=cnt; j>=0; j--){
                board[j][i]='z';
            }
        }
        v.clear();
    }
}

int solution(int m, int n, vector<string> board) {
    bool **check = new bool*[m];
    for(int i=0;i<m;i++) check[i] = new bool[n];

    int answer = 0;

    while(1){
        bool checking= false;
        setFalse(check,m,n);
        for(int i=m-1;i>=1;i--){
            for(int j=0;j<n-1;j++){
                bool ch = IsErase(board, check, i, j);
                if(ch== true) checking= true;
            }
        }

        if(checking== false) break;
        answer += erase(board,check,m,n);
        downBlock(board,m,n);
    }
    return answer;
}

setFalse 메소드 : check 배열을 false로 초기화

IsErase 메소드 : 2*2로 매치되는 블록이 있는지 여부를 반환. 있다면 check 배열에 해당 블록들을 true로 초기화.

erase 메소드 : check 배열에 true로 표시된 위치의 board를 지우기. ‘z’로 표시.

downBlock 메소드 : 빈공간이 있다면 블록을 아애로 떨어트리기.



4. 풀이하면서 고민했던 점

  • 테스트9 에서 오류가남. 알고보니 블록으로 대문자 영문이 들어올 수 있는데 빈공간을 대문자 ‘Z’로 설정해두어서 생기는 오류였음. 대문자 ‘Z’를 소문자 ‘z’로 바꾸고 성공함.



5. 문제를 풀고 알게된 개념 및 소감

  • 배열 원소 접근에 대한 이해도가 올라감.

  • 구현에 대한 자신감이 생김.