반응형
https://programmers.co.kr/learn/courses/30/lessons/17679
풀이
차례로 board를 탐색하면서 블록을 지워가면 되는 문제입니다.
제거할 수 있는 블록을 찾으면서 동시에 제거해버리면 그 블록과 겹치게 4블록이 생성되는 경우 제대로 풀이되지 않습니다.
따라서 임시로 제거할 블록을 저장할 temp 벡터를 하나만들고, 제거할 블록을 찾은 후에 블록을 제거해주어야 합니다.
또한 블록을 제거한 후에는 그 빈부분이 채워지도록 위의 블록을 아래로 내려주어야 합니다.
#include <string>
#include <vector>
using namespace std;
int solution(int m, int n, vector<string> board) {
int answer = 0;
bool del;
vector<string> temp;
temp.resize(board.size());
copy(board.begin(), board.end(), temp.begin());
while(1){
copy(board.begin(), board.end(), temp.begin());
del = false;
//제거 가능한 블록 찾기
for(int i=0; i<m-1; i++){
for(int j=0; j<n-1; j++){
if(board[i][j] == '.')
continue;
//4블록!->삭제
if(board[i][j] == board[i][j+1] && board[i][j] == board[i+1][j] && board[i][j] == board[i+1][j+1]){
temp[i][j] = '.';
temp[i][j+1] = '.';
temp[i+1][j] = '.';
temp[i+1][j+1] = '.';
del = true;
}
}
}
//더이상 제거 불가 -> while문 종료
if(del == false)
break;
//board에 빈칸 표시
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (temp[i][j] == '.') {
board[i][j] = '.';
}
}
}
//블록 내리기
for (int i = 1; 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] = '.';
}
}
}
}
}
//삭제된 블록 모두 세기
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == '.') {
answer++;
}
}
}
return answer;
}
728x90
반응형
'알고리즘 > PS - 프로그래머스' 카테고리의 다른 글
[프로그래머스 - C++] 기지국 설치 (0) | 2021.08.02 |
---|---|
[프로그래머스 - C++] 짝지어 제거하기 (0) | 2021.08.02 |
[프로그래머스 - C++] [1차] 뉴스 클러스터링 (0) | 2021.08.02 |
[프로그래머스 - C++] 경주로 건설 (0) | 2021.07.30 |
[프로그래머스 - C++] 후보키 (0) | 2021.07.30 |