[프로그래머스/C++] [1차] 프렌즈4블록
1.문제 링크
2. 풀이 전 계획과 생각
- 구현하기
3. 풀이
#include <string>
#include <vector>
using namespace std;
void setFalse(bool **check, int m, int n){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
check[i][j]= false;
}
}
}
bool IsErase(vector<string> &board, bool **check, int m, int n){
char sc = board[m][n];
if(sc=='z') return false;
if(sc==board[m-1][n] && sc==board[m-1][n+1] &&
sc==board[m][n+1]){
check[m-1][n]= true;
check[m-1][n+1]= true;
check[m][n+1]= true;
check[m][n]= true;
return true;
}
else return false;
}
int erase(vector<string> &board, bool **check, int m , int n){
int cnt=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(check[i][j]) {
board[i][j]='z';
cnt++;
}
}
}
return cnt;
}
void downBlock(vector<string> &board, int m, int n){
vector<char> v;
for(int i=0;i<n;i++){
for(int j=m-1;j>=0;j--){
if(board[j][i]!='z'){
v.push_back(board[j][i]);
}
}
if(v.size()!=0){
int cnt=m-1;
for(int j=0;j<v.size();j++){
board[cnt--][i]=v[j];
}
for(int j=cnt; j>=0; j--){
board[j][i]='z';
}
}
v.clear();
}
}
int solution(int m, int n, vector<string> board) {
bool **check = new bool*[m];
for(int i=0;i<m;i++) check[i] = new bool[n];
int answer = 0;
while(1){
bool checking= false;
setFalse(check,m,n);
for(int i=m-1;i>=1;i--){
for(int j=0;j<n-1;j++){
bool ch = IsErase(board, check, i, j);
if(ch== true) checking= true;
}
}
if(checking== false) break;
answer += erase(board,check,m,n);
downBlock(board,m,n);
}
return answer;
}
setFalse 메소드 : check 배열을 false로 초기화
IsErase 메소드 : 2*2로 매치되는 블록이 있는지 여부를 반환. 있다면 check 배열에 해당 블록들을 true로 초기화.
erase 메소드 : check 배열에 true로 표시된 위치의 board를 지우기. ‘z’로 표시.
downBlock 메소드 : 빈공간이 있다면 블록을 아애로 떨어트리기.
4. 풀이하면서 고민했던 점
- 테스트9 에서 오류가남. 알고보니 블록으로 대문자 영문이 들어올 수 있는데 빈공간을 대문자 ‘Z’로 설정해두어서 생기는 오류였음. 대문자 ‘Z’를 소문자 ‘z’로 바꾸고 성공함.
5. 문제를 풀고 알게된 개념 및 소감
-
배열 원소 접근에 대한 이해도가 올라감.
-
구현에 대한 자신감이 생김.