프로그래머스 - 프렌즈4블록 - C++

hansol_Shin·2021년 5월 15일
0

Algorithm

목록 보기
8/12

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

문제설명

  • 블록 깨기 게임을 기반으로 얼마나 많은 블록이 깨지는가를 return하는 문제이다.

  • 블록이 깨지는 조건은 2*2 크기의 정사각형이 모두 같은 캐릭터일 때 이다.

  • 블록이 깨진 후에는 남아있는 블록이 빈칸을 다 채우면서 내려온다.

  • 내려온 후 깨질 블록이 있는지 체크한다.

  • 이 과정을 반복하면서 더 이상 깨질 블록이 없으면 종료한다.

접근 방법

  • 간단한 시뮬레이션 문제로 접근하였다.

  • 깨질 블록이 있는지 탐색하는데 2*2 정사각형임을 감안하여 index를 알맞게 탐색하면 된다.

  • 깨진 블록을 -로 채워주면서 깨진 블록 개수를 더해준다.

  • -인 블록을 만나면 while을 사용하여 index가 정상 범위일 때 까지 윗방향으로 끌어올린다.

  • 위 과정을 do-while로 반복하면서 더 이상 깨질 블록이 없으면 종료한다.

풀이

#include <string>
#include <vector>

using namespace std;
char map[31][31];
int solution(int m, int n, vector<string> board) {
    int answer = 0;
    int new_ans = 0;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            map[i][j] = board[i][j];
        }
    }
    
    do{
        answer = new_ans;
        bool phang[31][31] = {false, };	// 깨질 블록을 채크할 변수
        
        // 깨질 블록 체크하기
        for(int i=0;i<m-1;i++){
            for(int j=0;j<n-1;j++){
                char tmp = map[i][j];
                if(tmp == '-')continue;
                if(tmp == map[i+1][j] && tmp == map[i][j+1] && tmp == map[i+1][j+1]){
                    phang[i][j] = true;
                    phang[i+1][j] = true;
                    phang[i][j+1] = true;
                    phang[i+1][j+1] = true;
                }
            }
        }
	// 블록 깨트리기
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(phang[i][j]){ 
                    map[i][j]='-';
                    new_ans++;
                }
            }
        }
        
        // 남은 블록 내리기
        for(int i=1;i<m;i++){
            for(int j=0;j<n;j++){
                if(map[i][j]=='-'){
                    int t = i;
                    while(t>0){
                        map[t][j] = map[t-1][j];
                        map[t-1][j] = '-';
                        t--;
                    }
                }
            }
        }
    }while(answer != new_ans);
    return answer;
} 

결과

profile
늘 완벽하고싶다.

0개의 댓글