๐Ÿ’ญ 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๋ฅผ ์„ ํƒํ•œ ์ด์œ 

  1. ๊ทธ๋ฃน ์ €์žฅ์ด ์‰ฌ์›€
    BFS๋Š” ํƒ์ƒ‰ ๊ณผ์ •์—์„œ ํ์— ๋„ฃ์€ ์ขŒํ‘œ๋“ค์„ ๊ทธ๋Œ€๋กœ ๋ชจ์•„์„œ
    vector<pair<int, int>> group์ฒ˜๋Ÿผ ๋ฐฉ๋ฌธํ•œ ์ขŒํ‘œ๋ฅผ ์‰ฝ๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ.
  2. ์žฌ๊ท€ ๊นŠ์ด ์ œํ•œ ์—†์Œ
    DFS์—์„œ ์ตœ์•…์˜ ๊ฒฝ์šฐ, ๋ฟŒ์š” 72๊ฐœ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด ์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ 72๋ฒˆ ๋จ.
  3. ์—ฌ๋Ÿฌ ๊ทธ๋ฃน ๋™์‹œ ์ฒ˜๋ฆฌ์— ์œ ๋ฆฌ
    BFS๋Š” ๊ฐ ํƒ์ƒ‰๋งˆ๋‹ค ๊ทธ๋ฃน ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์‰ฌ์›Œ์„œ,
    ํ•œ ํ„ด์— ์—ฌ๋Ÿฌ ๊ทธ๋ฃน์ด ๋™์‹œ์— ํ„ฐ์ง€๋Š” ๊ฒŒ์ž„ ๋กœ์ง์— ์ ํ•ฉํ•จ.

๐Ÿ’ก BFS

  1. ์—ฐ๊ฒฐ๋œ ๊ฐ™์€ ์ƒ‰์˜ ๋ฟŒ์š”๋ฅผ BFS๋ฅผ ํ†ตํ•ด ์ฐพ๋Š”๋‹ค.
    ํƒ์ƒ‰ํ•˜๋ฉด์„œ ํ„ฐํŠธ๋ฆด ๋ฟŒ์š”์˜ ์ขŒํ‘œ์™€ ์—ฐ๊ฒฐ๋œ ๋ฟŒ์š”์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.
  2. ์—ฐ๊ฒฐ๋œ ๋ฟŒ์š”๊ฐ€ 4๊ฐœ ์ด์ƒ์ด๋ฉด ํ„ฐํŠธ๋ฆฐ๋‹ค.
    ํ„ฐํŠธ๋ฆด ๋ฟŒ์š”์˜ ์ขŒํ‘œ์— .์„ ์‚ฝ์ž…ํ•œ๋‹ค.
  3. ์—ฐ์‡„๊ฐ€ ์ผ์–ด๋‚œ ํ›„์˜ ํ•„๋“œ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.
    ๊ฐ ์—ด์˜ ๋ฟŒ์š”๋ฅผ ๋ชจ์•„ ์•„๋ž˜์—์„œ ๋ถ€ํ„ฐ ์ฑ„์›Œ์ค€๋‹ค.
  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;
}