Software

(프로그래머스 c++ KAKAO)프렌즈 4블록 본문

프로그래머스 알고리즘/KAKAO

(프로그래머스 c++ KAKAO)프렌즈 4블록

favorcom 2020. 6. 2. 10:24
728x90
반응형

모든 블록을 계속 순회하여 없앨 수 있는 블록이 없을 때까지 while문으로 반복한다.

우선 bool형 변수 keep을 이용하여 없앨 수 있는 블록이 있는지 flag를 지정한다.

bool형 배열 arr[30][30]을 while문에서 선언하여 모두 false로 초기화한다.

arr 배열을 이용하여 블록을 없애고 정렬을 할 예정이다.

 

2중 for문을 이용하여 같은 블록이 있는 범위를 구하도록 하자.

만약 board[i][j]가 공백이라면 검사를 하지 않고 continue한다.

공백이 아니라면 해당 문자를 target으로 삼고, 주변 4블록이(현재 자기 자신 포함) target과 같은지 검사한다.

 

4개의 블록이 모두 같으면 arr배열의 해당 위치를 true로 바꿔주고 keep 또한 true로 바꿔준다.

더불어 4개의 블록이 모두 같고, 4블록 외에도 주변 블록이 target과 같은지 이중 for문을 이용하여 끝까지 검사한다.

 

주변 블록이 target과 같고, arr 배열도 true로 바꿔주었으면 해당 블록들을 지우고, answer 또한 늘려주도록 한다.

그리고 블록을 지웠으면 위에 남아 있는 블록들은 모두 내려와야 하기 때문에 3중 for문을 이용하여 바꿔주고, 없어진 블록들은 board에서 공백(' ')으로 바꿔주면 된다..!

#include <string>
#include <vector>

using namespace std;

int solution(int m, int n, vector<string> board) {
    int answer = 0, i = 0, j = 0;
    bool keep = true;
    
    while(keep)
    {
        bool arr[30][30] = {false, };
        keep = false;
        
        for(i = 0; i < m - 1; i++)
        {
            for(j = 0; j < n - 1; j++)
            {
                if(board[i][j] == ' ')
                    continue;
                char target = board[i][j];
                
                if(board[i][j + 1] == target && board[i + 1][j] == target && board[i + 1][j + 1] == target)
                {
                    arr[i][j] = true;
                    arr[i][j + 1] = true;
                    arr[i + 1][j] = true;
                    arr[i + 1][j + 1] = true;
                    keep = true;
                }
            }
        }
        
        for(int i = 0; i < m; i++)
        {
            for(int j = 0; j < n; j++)
            {
                if(arr[i][j] == true)
                {
                    answer++;
                    
                    for(int k = i - 1; k >= 0; k--)
                    {
                        board[k + 1][j] = board[k][j];
                        board[k][j] = ' ';
                    }
                }
            }
        }
    }
    
    return answer;
}
728x90
반응형