[2023년 11월 24일][1차]프렌즈4블록(35분)

myeongrangcoding·2023년 11월 23일

프로그래머스

목록 보기
51/65

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

구현 아이디어 5분 구현 30분

풀이

#include <string>
#include <vector>

using namespace std;

char check[30][30];
int dr[3] = {0, 1, 1};
int dc[3] = {1, 1, 0};

int solution(int m, int n, vector<string> board) {
    int answer = 0;
    
    while(true)
    {
        bool end = true;
        for(int i = 0; i < m - 1; ++i)
            for(int j = 0; j < n - 1; ++j)
            {
                char cur_char = board[i][j];
                if(cur_char == '0') continue;
                bool flag = true;
                for(int k = 0; k < 3; ++k)
                {
                    int check_r = i + dr[k];
                    int check_c = j + dc[k];

                    if(cur_char != board[check_r][check_c])
                    {
                        flag = false;
                        break;
                    }
                }
                if(!flag) continue;
                end = false;
                check[i][j] = 1;
                for(int k = 0; k < 3; ++k)
                {
                    int check_r = i + dr[k];
                    int check_c = j + dc[k];
                    check[check_r][check_c] = 1;
                }
            }
        
        if(end) break;
        
        for(int i = 0; i < m; ++i)
            for(int j = 0; j < n; ++j)
                if(check[i][j])
                {
                    // 얘가 1이면 삭제될 블록.
                    // 원본을 알파벳이 아닌 다른 값으로 대입하기.
                    ++answer;
                    board[i][j] = '0';
                }

        // 블록 내리기.
        for(int i = m - 2; i >= 0; --i)
        {
            for(int j = 0; j < n; ++j)
            {
                char cur_char = board[i][j];
                int check_i = i + 1;
                while(true)
                {
                    if(check_i == m) break;
                    if(board[check_i][j] == '0')
                    {
                        ++check_i;
                    }
                    else break;
                }
                
                char change = board[i][j];
                board[i][j] = board[check_i - 1][j];
                board[check_i - 1][j] = change;
            }
        }
        
        // check 배열 초기화.
        for(int i = 0; i < m; ++i)
            for(int j = 0; j < n; ++j)
                check[i][j] = 0;
    }
    return answer;
}
profile
명랑코딩!

0개의 댓글