프로그래머스/2레벨
[1차] 프렌즈4블록/C++
Koalitsiya
2023. 2. 21. 14:39
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 조건
- 같은 모양의 블록이 2x2 형태로 붙어있을 경우 지워진다.
- 한 블록이 여러 개의 2x2에 포함될 수 있다.
- 조건에 만족하는 2x2 모양이 여러 개 있다면 한 번에 지워진다.
- 조건에 만족하는 블록들이 한 차례 지워진 후 남은 블록들이 아래로 떨어져 빈 공간을 채우고 다시 위를 반복한다.
- 최종적으로 지워진 블록들의 개수를 반환한다.
풀이 방법
1. 제거될 블록이 있는지를 확인하기 위한 flag와 어느 위치의 블록이 제거될지를 체크 해놓을 bool형 2차원 벡터 check를 선언한다.
2. check와 flag를 false로 초기화한다.
3. 반복문을 통해 제거될 블록들을 체크한다.
4. check[i][j]가 true일 경우 board[i][j]에 공백을 대입하고 answer++한다.
5. 아래에 공백이 있을 경우 블록을 아래로 떨어뜨려준다.
6. flag가 true라면 2번으로 돌아간다.
7. answer 리턴
#include <string>
#include <vector>
using namespace std;
int solution(int m, int n, vector<string> board) {
int answer = 0;
bool flag = false;
vector<vector<bool>> check(m, vector<bool>(n, false));
do {
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++)
check[i][j] = false;
}
flag = false;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(i == 0 || j == 0 || board[i][j] == ' ')
continue;
else if(board[i][j] == board[i - 1][j] &&
board[i - 1][j] == board[i - 1][j - 1] &&
board[i - 1][j - 1] == board[i][j - 1]) {
check[i][j] = true;
check[i - 1][j] = true;
check[i - 1][j - 1] = true;
check[i][j - 1] = true;
flag = true;
}
}
}
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(check[i][j] == true) {
board[i][j] = ' ';
answer++;
}
}
}
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(board[i][j] == ' ') {
for(int k = i; k > 0; k--) {
if(board[k - 1][j] == ' ')
break;
board[k][j] = board[k - 1][j];
board[k - 1][j] = ' ';
}
}
}
}
} while(flag);
return answer;
}