[c++/프로그래머스] [1차] 프렌즈4블록

조히·2023년 8월 4일
0

PS

목록 보기
77/82
post-thumbnail

문제 링크

[1차] 프렌즈4블록

풀이

테케 5번만 안풀리길래 뭐지 했는데 checkBoard에서 빈 칸일 때 continue 해줘야하는 걸, break 함..ㅋㅋ

  1. 먼저 v에 초기화 해주고, while문을 돌려서 checkBoardtrue일 때 계속 반복해준다.
  2. checkBoard는 터질 블럭이 있는지 체크하는 함수
    2-1. 보드를 돌려보며 인덱스를 기준으로 오른쪽, 아래, 오른쪽 대각선 아래가 같은지 체크해서 같으면 터질 블럭으로 간주하고 seterase에 추가한다. (중복 블럭이 있을 수 있으니 바로 지우면 안됨)
    2-2. 빈칸으로 네 개가 다 같아도 터질 블럭이라 간주하면 while문이 평생 안끝날 수도 있으니 빈 칸이면 continue 해준다.
  3. eraseBlock은 블럭을 지우고 위에 있는 블럭들을 내리는 함수
    3-1. erase를 돌면서 answer++해주고, 빈 칸으로 만들어준다.
    3-2. 위에 행부터 밑으로 가면서 체크하는데, 방문하는 블럭 밑 칸이 빈칸일 경우 반복문을 통해 해당 블럭부터 0행까지 쫙 다 내려오게 한다. 내려오는 중에 빈칸인 블럭이 나온다면 위에도 빈칸이니까 바로 break
  4. erase는 참조로 했기 때문에 clear를 잊지 않도록 한다.

코드

#include <string>
#include <vector>
#include <set>

using namespace std;
int answer = 0;

void eraseBlock(vector<vector<char>> &v, set<pair<int,int>> &erase)
{
    for(auto u:erase) // 지워질 블럭 '0'으로 체크
    {
        answer++;
        v[u.first][u.second] = '0';
    }
    
    for(int i=0;i<v.size()-1;i++)
    {
        for(int j=0;j<v[i].size();j++)
        {
            if(v[i+1][j] == '0') // 밑에 있는게 지워질 블럭이라면
            {
                for(int k=i;k>=0;k--)
                {
                    if(v[k][j] == '0') break;
                    v[k+1][j] = v[k][j];
                    v[k][j]='0';
                }
            }
        }
    }
}

bool checkBoard(vector<vector<char>> &v, set<pair<int,int>> &erase) // 터질 블럭이 있는지 체크
{
    bool flag = false;
    for(int i=0;i<v.size()-1;i++)
    {
        for(int j=0;j<v[i].size()-1;j++)
        {
            if(v[i][j] == '0') continue;
            if(v[i][j] == v[i][j+1] && v[i][j] == v[i+1][j] && v[i][j] == v[i+1][j+1])
            {
                erase.insert({i, j});
                erase.insert({i, j+1});
                erase.insert({i+1, j});
                erase.insert({i+1, j+1});
                flag = true;
            }
        }
    }
    return flag;
}

int solution(int m, int n, vector<string> board) {    
    vector<vector<char>> v(m, vector<char>(n));
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            v[i][j] = board[i][j];
        }
    }
    
    set<pair<int,int>> erase;
    while(checkBoard(v, erase)) // 지울 블럭이 있다면
    {
        eraseBlock(v, erase); // 지우기
        erase.clear();
    }
    
    return answer;
}
profile
Juhee Kim | Game Client Developer

1개의 댓글

comment-user-thumbnail
2023년 8월 4일

유익한 글이었습니다.

답글 달기