알고리즘/PS - 프로그래머스
[프로그래머스 - C++] [1차] 프렌즈4블록
excited-hyun
2021. 8. 2. 16:45
반응형
https://programmers.co.kr/learn/courses/30/lessons/17679
코딩테스트 연습 - [1차] 프렌즈4블록
프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록". 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙
programmers.co.kr
풀이
차례로 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
반응형