코딩테스트/프로그래머스

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

쪼르뚜 2024. 8. 24. 16:02
728x90
반응형


🔗 문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


반응형

👩‍💻 코드

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

using namespace std;

int solution(int m, int n, vector<string> board) {
    int answer = 0;
    bool hasMatch = true;
    
    while(hasMatch){
        hasMatch = false;
        set<pair<int, int>> erasePos;
        
        for(int i=0; i<m-1; i++){
            for(int j=0; j<n-1; j++){
                char block = board[i][j];

                if(block != ' ' && block == board[i][j+1] && 
                   block == board[i+1][j] && block == board[i+1][j+1]){
                    erasePos.insert({i, j});
                    erasePos.insert({i, j+1});
                    erasePos.insert({i+1, j});
                    erasePos.insert({i+1, j+1});
                    hasMatch = true;
                }
            }
        }
        
        for (auto pos : erasePos) {
            int x = pos.first;
            int y = pos.second;
            
            if (board[x][y] != ' ') {
                board[x][y] = ' ';
                answer++;
            }
        }
        
        for (int j = 0; j < n; j++) {
            int emptyIndex = m - 1;
            for (int i = m - 1; i >= 0; i--) {
                if (board[i][j] != ' ') {
                    swap(board[emptyIndex][j], board[i][j]);
                    emptyIndex--;
                }
            }
        }
    }
    
    return answer;
}

📝 풀이

먼저 보드를 순회하면 2x2 블록이 같은 문자인지 확인합니다.

조건을 만족한다면 위치를 erasePos에 저장합니다.

 

erasePos에 저장된 위치를 블록을 지우고 answer을 증가시킵니다.

 

열을 기준으로 아래쪽부터 순회하며 블록을 떨어트립니다.

emptyIndex는 블록이 떨어져야 할 위치를 나타냅니다.

블록이 빈공간이 아니라면 아래로 떨어져야함으로 현재 블록과 emptyIndex 위치의 블록을 스왑합니다.

 

더 이상 2x2 블록이 없다면 반복문을 종료하고 answer을 return 합니다.

728x90
반응형