코딩테스트/프로그래머스
[프로그래머스] [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
반응형