๐ญ Problem Solving/C++
[BOJ][C++] ๋ฐฑ์ค 11559๋ฒ: Puyo Puyo
0=2.
2025. 5. 18. 05:53
๋ฌธ์
https://www.acmicpc.net/problem/11559
๋ฌธ์ ์ดํด
๋ฟ์๋ฟ์ ๊ฒ์ ์ค, ํ์ฌ ์ฃผ์ด์ง ํ๋์์ ๋ช์ฐ์๊ฐ ๋๋์ง ๊ตฌํ๋ค.
๋ฟ์๋ฟ์ ๋ฃฐ
- ๋ฟ์์ ์์ R, G, B, Y๊ฐ ์๋ค.
- ๊ฐ์ ์ ๋ฟ์๊ฐ 4๊ฐ ์ด์ ์ํ์ข์ฐ๋ก ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด ๊ทธ ๋ฟ์๋ค์ด ๋ชจ๋ ์์ด์ง๋ค. ์ด๊ฒ์ 1์ฐ์๋ผ๊ณ ํ๋ค.
- ๋ฟ์๋ ์๋์ ๋ฐ๋ฅ์ด๋ ๋ค๋ฅธ ๋ฟ์๊ฐ ๋์ฌ ๋๊น์ง ์๋๋ก ๋จ์ด์ง๋ค. ๋ฟ์๊ฐ ์์ด์ง๋ฉด, ๋๊ฐ์ด ์๋๋ก ๋จ์ด์ง๋ค.
- ์๋๋ก ๋จ์ด์ง๊ณ ๋์ ๋ค์ ๋ฟ์๊ฐ ํฐ์ง๋ฉด 1์ฐ์๊ฐ ๋์ด๋๋ค.
๐จ ํฐ์ง ์ ์๋ ๋ฟ์๊ฐ ์ฌ๋ฌ ๊ทธ๋ฃน์ด ์๋ค๋ฉด ๋์์ ํฐ์ง๋ค. ์ฌ๋ฌ ๊ทธ๋ฃน์ด ํฐ์ง๋๋ผ๋ 1์ฐ์๊ฐ ์ถ๊ฐ๋๋ค.
๋ฌธ์ ํ์ด
๐ ์ ๊ทผ
์ฐ๊ฒฐ๋ ๊ฐ์ ์์ ๋ฟ์๋ฅผ ์ฐพ๋๋ค๋ ๊ด์ ์์ DFS, BFS ํ์์ ๋ ์ฌ๋ฆด ์ ์๋ค.
ํ์ ํ ์ฐ๊ฒฐ๋ ๋ฟ์๊ฐ 4๊ฐ ์ด์์ด๋ฉด ํฐํธ๋ฆฌ๊ณ , ๋ค์ ํ์ํ๋ค.
โ DFS๋ณด๋ค BFS๋ฅผ ์ ํํ ์ด์
- ๊ทธ๋ฃน ์ ์ฅ์ด ์ฌ์
BFS๋ ํ์ ๊ณผ์ ์์ ํ์ ๋ฃ์ ์ขํ๋ค์ ๊ทธ๋๋ก ๋ชจ์์
vector<pair<int, int>> group์ฒ๋ผ ๋ฐฉ๋ฌธํ ์ขํ๋ฅผ ์ฝ๊ฒ ์ ์ฅํ ์ ์์. - ์ฌ๊ท ๊น์ด ์ ํ ์์
DFS์์ ์ต์ ์ ๊ฒฝ์ฐ, ๋ฟ์ 72๊ฐ๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด ์ฌ๊ท ํจ์ ํธ์ถ 72๋ฒ ๋จ. - ์ฌ๋ฌ ๊ทธ๋ฃน ๋์ ์ฒ๋ฆฌ์ ์ ๋ฆฌ
BFS๋ ๊ฐ ํ์๋ง๋ค ๊ทธ๋ฃน ๋จ์๋ก ๋ถ๋ฆฌํ์ฌ ์ฒ๋ฆฌํ๊ธฐ ์ฌ์์,
ํ ํด์ ์ฌ๋ฌ ๊ทธ๋ฃน์ด ๋์์ ํฐ์ง๋ ๊ฒ์ ๋ก์ง์ ์ ํฉํจ.
๐ก BFS
- ์ฐ๊ฒฐ๋ ๊ฐ์ ์์ ๋ฟ์๋ฅผ BFS๋ฅผ ํตํด ์ฐพ๋๋ค.
ํ์ํ๋ฉด์ ํฐํธ๋ฆด ๋ฟ์์ ์ขํ์ ์ฐ๊ฒฐ๋ ๋ฟ์์ ๊ฐ์๋ฅผ ์ ์ฅํ๋ค. - ์ฐ๊ฒฐ๋ ๋ฟ์๊ฐ 4๊ฐ ์ด์์ด๋ฉด ํฐํธ๋ฆฐ๋ค.
ํฐํธ๋ฆด ๋ฟ์์ ์ขํ์ .์ ์ฝ์ ํ๋ค. - ์ฐ์๊ฐ ์ผ์ด๋ ํ์ ํ๋๋ก ๊ฐฑ์ ํ๋ค.
๊ฐ ์ด์ ๋ฟ์๋ฅผ ๋ชจ์ ์๋์์ ๋ถํฐ ์ฑ์์ค๋ค. - 1 ~ 3์ ๊ณผ์ ์ ํฐํธ๋ฆด ๋ฟ์๊ฐ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
BFS ํ์ ํ ์ฐ๊ฒฐ๋ ๋ฟ์์ ๊ฐ์๊ฐ 4 ์ด์์ด๋ฉด true๋ฅผ ๋ฐํํ์ฌ flag ๋ณ์์ ํ์ํ๋ค.
์ฝ๋
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
typedef pair<int, int> pii;
const int MAX_ROW = 12;
const int MAX_COL = 6;
int dr[4] = {-1, 1, 0, 0};
int dc[4] = {0, 0, -1, 1};
void update_field(vector<vector<char>> &field) {
for (int i = 0; i < MAX_COL; i++) {
vector<char> puyo;
for (int j = 0; j < MAX_ROW; j++) {
if (field[j][i] == '.')
continue;
puyo.push_back(field[j][i]);
}
for (int j = MAX_ROW - 1; j >= 0; j--) {
if (puyo.empty()) {
field[j][i] = '.';
} else {
field[j][i] = puyo.back();
puyo.pop_back();
}
}
}
}
bool bfs(int r, int c, vector<vector<char>> &field) {
queue<pii> q;
vector<pii> exploded;
vector<vector<bool> > visited(MAX_ROW, vector<bool>(MAX_COL, false));
int cnt = 1;
char color = field[r][c];
q.push({r, c});
exploded.push_back({r, c});
visited[r][c] = true;
while (!q.empty()) {
auto [r, c] = q.front();
q.pop();
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if (nr < 0 || nr >= MAX_ROW || nc < 0 || nc >= MAX_COL
|| field[nr][nc] != color || visited[nr][nc])
continue;
visited[nr][nc] = true;
q.push({nr, nc});
exploded.push_back({nr, nc});
cnt++;
}
}
if (cnt < 4)
return false;
for (auto i: exploded)
field[i.first][i.second] = '.';
return true;
}
int solution(vector<vector<char>> &field) {
int ans = 0;
while (true) {
bool flag = false;
for (int i = 0; i < MAX_ROW; i++) {
for (int j = 0; j < MAX_COL; j++) {
if (field[i][j] == '.')
continue;
if (bfs(i, j, field))
flag = true;
}
}
if (!flag)
break;
update_field(field);
ans++;
}
return ans;
}
int main() {
vector<vector<char> > field(MAX_ROW, vector<char>(MAX_COL, '.'));
// ์
๋ ฅ
for (int i = 0; i < MAX_ROW; i++) {
for (int j = 0; j < MAX_COL; j++) {
cin >> field[i][j];
}
}
// ์ถ๋ ฅ
cout << solution(field);
return 0;
}