#include <string> #include <vector> #include <iostream> #include <queue> #include <map> #include <string.h> #include <algorithm> using namespace std; char block[35][35]; int visited[35][35]; int row, col; bool bomb_flag = false; int dx[4] = {-1, 1, 0, 0}; int dy[4] = {0, 0, -1, 1}; int safe(int x, int y) { if(x >= 0 && x < row && y >= 0 && y < col) { return 1; } else { return 0; } } void bomb(int x, int y) { vector<pair<int, int>> del; // 삭제할 블럭 좌표 저장 queue<pair<int, int>> q; q.push({x, y}); visited[x][y] = 1; del.push_back({x, y}); while(!q.empty()) { x = q.front().first; y = q.front().second; q.pop(); for(int i = 0; i < 4; i++) { int xpos = x+dx[i]; int ypos = y+dy[i]; if(safe(xpos, ypos) == 1 && block[xpos][ypos] == block[x][y] && visited[xpos][ypos] == 0) { visited[xpos][ypos] = 1; q.push({xpos, ypos}); del.push_back({xpos, ypos}); } } } // 삭제할 좌표가 4개이상이면 2*2블록 후보이기 때문에 맞는지 체크 if(del.size() >= 4) { sort(del.begin(), del.end()); // 2*2 블록인지 체크 int check_block[35][35]; memset(check_block, 0, sizeof(check_block)); for(int i = 0; i < del.size(); i++) { vector<pair<int, int>> temp; int xx = del[i].first; int yy = del[i].second; temp.push_back({xx, yy}); if(safe(xx+1, yy) == 1 && safe(xx, yy+1) == 1 && safe(xx+1, yy+1) == 1) { if(block[xx][yy] == block[xx+1][yy]) { temp.push_back({xx+1, yy}); } if(block[xx][yy] == block[xx][yy+1]) { temp.push_back({xx, yy+1}); } if(block[xx][yy] == block[xx+1][yy+1]) { temp.push_back({xx+1, yy+1}); } } // 2*2 블록이 맞으면 check_block에 표시 if(temp.size() == 4) { for(int k = 0; k < temp.size(); k++) { check_block[temp[k].first][temp[k].second] += 1; } } } // 2*2 블록 bomb for(int i = 0; i < row; i++) { for(int j = 0; j < col; j++) { if(check_block[i][j] >= 1) { // 터지면 종료조건 true bomb_flag = true; block[i][j] = '0'; } } } // 블록이 아래로 떨어지는 경우 for(int i = 0; i < col; i++) { queue<char> temp_q; for(int j = row-1; j >= 0; j--) { if(block[j][i] != '0') { temp_q.push({block[j][i]}); } block[j][i] = '0'; } for(int j = row-1; !temp_q.empty(); j--) { block[j][i] = temp_q.front(); temp_q.pop(); } } } } int solution(int m, int n, vector<string> board) { row = m; col = n; for(int i = 0; i < row; i++) { for(int j = 0 ; j < col; j++) { block[i][j] = board[i][j]; } } while(1) { bomb_flag = false; memset(visited, 0, sizeof(visited)); for(int i = 0; i < row; i++) { for(int j = 0; j < col; j++) { if(visited[i][j] == 0 && block[i][j] != '0') { bomb(i, j); } } } if(bomb_flag == false) { break; } } // block이 0인 갯수 세기 == 터진 갯수 int answer = 0; for(int i = 0; i < row; i++) { for(int j = 0; j < col; j++) { if(block[i][j] == '0') { answer++; } } } return answer; } | cs |
'Programmers > Level 2' 카테고리의 다른 글
[프로그래머스 2] 후보키 (C/C++) (★★★) (0) | 2020.03.06 |
---|---|
[프로그래머스 2] 방금 그곡 (C/C++) (★) (0) | 2020.02.28 |
[프로그래머스 2] 조이스틱 (C/C++) (★★★) (0) | 2020.01.10 |
[프로그래머스 2] 점프와 순간이동 (C/C++) (0) | 2020.01.07 |
[프로그래머스 2] 단체사진 찍기 (C/C++) (0) | 2020.01.06 |