복습 차원에서 예전에 본사에서 풀어봤던 문제를 다시 경험했다. 확실히 코딩 실력이 그래도 감이 돌아오고 있구나를 조금 경험했다.
처음 풀었을때만 해도 이거는 무조건 이렇게 풀어야해! 생각했지만 로직을 생각하니 이렇게 푸는게 더 깔끔하고 좋을거 같다는 마음이 들었다.
처음에는 오류가 몇개 났는데 다행히 금방 찾을 수 있었고, 조건을 함수로 빼면서 그나마 코드가 좀 깔끔해진거 같다.
class Solution {
int N,M;
public:
bool check(int i, int j, int flag, vector<vector<int>>& board){
if(flag == 0) return (i + 1 < N && i + 2 < N && board[i][j] != 0 && board[i][j] == board[i+1][j] && board[i][j] == board[i+2][j]);
return (j + 1 < M && j + 2 < M && board[i][j] != 0 && board[i][j] == board[i][j+1] && board[i][j] == board[i][j+2]);
}
void dropTop(int x, int y, vector<vector<int>>& board){
for(int i = x; i >= 0; i--){
//board[i][y] = 0;
if(i - 1 >= 0){
board[i][y] = board[i-1][y];
board[i-1][y] = 0;
} else{
board[i][y] = 0;
}
}
}
public:
vector<vector<int>> candyCrush(vector<vector<int>>& board) {
//vector<vector<bool>> visited(board.size(), vector<bool>(board[0].size(),false));
bool visited[51][51];
N = board.size(), M = board[0].size();
bool flag = true;
while(flag){
flag = false;
memset(visited,false,sizeof(visited));
for(int i = 0; i < board.size(); i++){
for(int j = 0; j < board[0].size(); j++){
if(check(i,j,0, board)){
visited[i][j] = true;
visited[i+1][j] = true;
visited[i+2][j] = true;
}
if(check(i,j,1, board)){
visited[i][j] = true;
visited[i][j+1] = true;
visited[i][j+2] = true;
}
}
}
for(int i = 0; i < board.size(); i++){
for(int j = 0; j < board[i].size(); j++){
if(visited[i][j]){
flag = true;
dropTop(i,j,board);
}
}
}
}
return board;
}
};