ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 프렌즈4블록 C++
    프로그래머스(Programmers) 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;
    }

     

     

     

    반응형

    댓글

Designed by Who.