프로그래머스(Programmers)

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

cosmohoo 2022. 7. 14. 23:43
반응형

 

 

위 초기 배치를 문자로 표시하면 아래와 같다.

TTTANT
RRFACC
RRRFCC
TRRRAA
TTMMMF
TMMTTJ

각 문자는 라이언(R), 무지(M), 어피치(A), 프로도(F), 네오(N), 튜브(T), 제이지(J), 콘(C)을 의미한다

입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.

입력 형식

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

출력 형식

입력으로 주어진 판 정보를 가지고 몇 개의 블록이 지워질지 출력하라.

입출력 예제

mnboardanswer

4 5 ["CCBDE", "AAADE", "AAABF", "CCBBF"] 14
6 6 ["TTTANT", "RRFACC", "RRRFCC", "TRRRAA", "TTMMMF", "TMMTTJ"] 15

 

 

=> DFS나 BFS를 사용하는 문제가 아닌 단순구현문제였습니다. 

=> 문제풀이에 관한 설명은 아래의 그림으로 대체하겠습니다. 

 

문제 풀이

 

#include <string>
#include <vector>

using namespace std;

bool TrueBoard[31][31] = {false,};

void init()
{
    for(int i=0; i<32; i++)
    {
        for(int j=0; j<32; j++)
        {
            TrueBoard[i][j] =false;
        }
    }
}

int solution(int m, int n, vector<string> board) {
    int answer = 0;
    //부신 블록수
    int breakCnt =0;
    
    //2x2 블록 확인할 행렬
    int dx[3] = {0,1,1};
    int dy[3] = {1,1,0};
    
    do
    {
        //TrueBoard 초기화 
        init();
        
        //while문을 위한 answer 설정
        answer = breakCnt;
        
        //지울블록 확인
        for(int i=0; i<m-1; i++)
        {
            for(int j=0; j<n-1; j++)
            {
             
              if(board[i][j] == '-')continue;     
             
              char tmp = board[i][j];    
              if((tmp == board[i+dx[0]][j+dy[0]]) && (tmp == board[i+dx[1]][j+dy[1]]) && (tmp == board[i+dx[2]][j+dy[2]])) 
              {
                  TrueBoard[i][j] = true;
                  TrueBoard[i+dx[0]][j+dy[0]] = true;
                  TrueBoard[i+dx[1]][j+dy[1]] = true;
                  TrueBoard[i+dx[2]][j+dy[2]] = true;
              }
            }
        }
        
        //블록지우기
        for(int i=0; i<m; i++)
        {
            for(int j=0; j<n; j++)
            {
                //지운다고 체크되어있다면 '-'표시
                if(TrueBoard[i][j])
                {
                    board[i][j] = '-';
                    breakCnt++;
                }
            }
        }
        
        //빈공간 채워넣기 
        for(int i=1; i<m; i++)
        {
            for(int j=0; j<n; j++)
            {
                //해당공간이 비어있다면 
                if(board[i][j] == '-')
                {
                    int tmpx = i; 
                    while(tmpx > 0)
                    {
                        board[tmpx][j] = board[tmpx-1][j];
                        board[tmpx-1][j] ='-';
                        tmpx --;
                    }
                }
            }
        }
        
        
    }while(answer != breakCnt);
    //이번시도에 부서진 블록수(breakCnt)와 이전시도까지 부서진 블록수와 갯수가 똑같을 경우 => 더이상 부서지지 않을 경우  
    
    
    
    return answer;
}

 

 

 

반응형