https://www.welcomekakao.com/learn/courses/30/lessons/17679

 

코딩테스트 연습 - [1차] 프렌즈4블록

프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 프렌즈4블록. 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙��

www.welcomekakao.com

#include <string>
#include <cstring>
#include <vector>
#include <iostream>

using namespace std;

int cnt = 0;
int arr[30][30];
int dy[] = { 0,1,1,0 };
int dx[] = { 1,0,1,0 };

void checking(int m, int n, vector <string> board) {
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            bool isOk = true;
            char c = board[i][j];
            if (c == ' ') {
                isOk = false;
            }
            if (isOk) {
                for (int k = 0; k < 3; k++)
                {
                    int y = i + dy[k];
                    int x = j + dx[k];
                    if (y >= m || x >= n || board[y][x] != c || board[y][x]==' ') {
                        isOk = false;
                        break;
                    }
                }
            }
            if (isOk) {
                for (int k = 0; k < 4; k++)
                {
                    arr[i + dy[k]][j + dx[k]] = true;
                }
            }
        }
    }
}

int erasing(int m, int n, vector <string> &board) {
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (arr[i][j] && board[i][j] != ' ') {
                board[i][j] = ' ';
                cnt++;
            }
        }
    }
    return cnt;
}

void down(int m, int n, vector <string> &board) {
    for (int j = 0; j < n; j++)
    {
        int idx = m - 1;
        for (int i = m - 1; i >= 0; i--)
        {
            if (board[i][j] != ' ') {
                char temp = board[i][j];
                board[i][j] = ' ';
                board[idx][j] = temp;
                idx--;
            }
        }
    }
}

int solution(int m, int n, vector<string> board) {
    int answer = 0;

    while (true) {
        cnt = 0;
        memset(arr, false, sizeof(arr));
        checking(m, n, board);
        answer+=erasing(m, n, board);
        down(m, n, board);
        if (cnt == 0)  break;
    }

    return answer;
}

+ Recent posts