๐Ÿ”ฅ๋ฐฑ์ค€ 11559 (๋ฟŒ์š” ๋ฟŒ์š”)

๋ง์ฐจยท2022๋…„ 7์›” 15์ผ
0

๋ฐฑ์ค€

๋ชฉ๋ก ๋ณด๊ธฐ
9/34

https://www.acmicpc.net/problem/11559

๋Š๋‚Œ์ƒ ์ง„์งœ ์–ด๋ ค์› ๋˜๊ฑฐ ๊ฐ™๋‹ค ์ €๋ฒˆ ๋ฒฝ ๋ถ€์ˆ˜๊ธฐ2๋ถ€ํ„ฐ ๋Š๋‚€๊ฑด๋ฐ ๋กœ์ง์€ ์งค ์ค„ ์•Œ์ง€๋งŒ ์‹ค์ˆ˜๋ฅผ ์—„์ฒญ ๋งŽ์ด ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค ์• ์ดˆ์— ๋‚œ์ด๋„๋„ ์—†์ง„ ์•Š๋‹ค๋ณด๋‹ˆ ์‹ค์ˆ˜ ํ•œ ๋ฒˆํ•˜๋ฉด ์—๋Ÿฌ์žก๊ธฐ๊ฐ€ ํ—ฌ์ด๋‹ค ์ด๋ฒˆ์— ์‹ค์ˆ˜ํ•œ ๋ถ€๋ถ„๋“ค์€

  1. ํ•œ ๋ฒˆ ๋‹ค ๋Œ๊ณ ๋‚˜์„œ ๋ฐฉ๋ฌธ ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ์ง€ ์•Š์•˜๋‹ค. -> bfsํ•  ๋•Œ ๋ฐฉ๋ฌธ๋ฐฐ์—ด ์œ ์˜ํ•˜์ž
  2. ๋ณ€์ˆ˜๊ฐ€ ์ค‘๊ฐ„์— ๊ฒน์ณค๋‹ค. -> ํŠนํžˆ ์ž์ฃผ ์“ฐ๋Š” i, j์˜ ์‚ฌ์šฉ์ด ํ•จ์ˆ˜๋‚ด์—์„œ ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ์œ ์˜ํ•˜์ž
  3. cnt๋Š” 3๋ถ€ํ„ฐ ์„ผ๋‹ค. ๋ฌธ์ œ์—์„œ 4๊ฐœ์ด์ƒ์ผ ๋•Œ ํ„ฐ์ง„๋‹ค๊ณ  ํ•ด์„œ ์ฒ˜์Œ์— cnt > 4๋ผ๊ณ  ๊ธฐ์ž…ํ•˜์˜€๋‹ค.
  4. popํ•จ์ˆ˜์—์„œ๋Š” tmp๋ฅผ ์„ค์ •ํ•ด์„œ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค. pop_possibleํ•จ์ˆ˜์™€ ๋‹ค๋ฅด๊ฒŒ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ณ  ๋‚˜๋‹ˆ๊นŒ
  5. drag_downํ•จ์ˆ˜์—์„œ๋Š” ๋ญ ๊ฑฐ์˜ ๋‹ค ์‹ค์ˆ˜ํ–ˆ๋‹ค. ์šฐ์„  .๊ณผ ๋ฌธ์ž๋ฅผ ์ฐพ๋Š” while๋ฌธ๋“ค์€ >= 0์ผ ๊ฒฝ์šฐ์— ๋งž์ถฐ ๋Œ์•„๊ฐ„๋‹ค
  6. ์‹œ์ž‘ํ•  ๋•Œ๋ถ€ํ„ฐ ๋ฌธ์ž์—ด์ด์—ˆ๋‹ค๋ฉด .์„ ๋Œ€์ž…ํ•˜๋Š” ๊ฐ’์— ๋„ฃ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
  7. while๋ฌธ๋‚ด์—์„œ ์ดˆ๊ธฐํ™”๋Š” .๊ณผ ๋ฌธ์ž์—ด์˜ ๋‹ค ๋”ํ•œ๋งŒํผ์ด ์•„๋‹ˆ๋‹ค. ์•„๋ž˜๋กœ ๋ฌธ์ž์—ด์„ ๋Œ์–ด๋‹น๊ธด๋งŒํผ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์‹ค์ˆ˜๋ฅผ 7๊ฐœ๋‚˜ ์ฐพ์•„์•ผ ํ–ˆ์œผ๋‹ˆ ๋ฌธ์ œ ๋‹ค ํ‘ธ๋Š”๋ฐ ํ•˜๋ฃจ ๊ฑธ๋ฆฐ๊ฑฐ ๊ฐ™๋‹ค. ์ทจup gae๋งํ–ˆda....

โ—๏ธํ’€์ด๋ฒ•

๊ฐ„๋‹จํ•˜๊ฒŒ ํŒ์ด ๊ฐ€๋Šฅํ•˜๋ฉด ํŒํ•˜๊ณ  drag downํ–ˆ๋‹ค. ๊ทผ๋ฐ ์ด ๊ณผ์ •์—์„œ bfs๋ฅผ 2๋ฒˆ ์‚ฌ์šฉํ–ˆ๊ณ  drag downํ•˜๋Š” ํ•จ์ˆ˜์—์„œ๋Š” ๋ฒ”์œ„์— ์‹ ๊ฒฝ์“ธ ๋ถ€๋ถ„๋“ค์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค. ๋ฐ”ํ‚น๋…๋‹˜์˜ ๋ฐฉ๋ฒ•์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒŒ ํ›จ์”ฌ ๋‚˜์„ ๋“ฏํ•˜๋‹ค.

ํŽ‘์ด ๊ฐ€๋Šฅํ•  ๋™์•ˆ do๋ฌธ์„ ๋ˆ๋‹ค. ์šฐ์„ ์ ์œผ๋กœ drag downํ•œ๋‹ค. ์ด drag downํ•˜๋Š” ๋ถ€๋ถ„์ด ์‹ ์„ ํ•˜๋‹ค. ๋ชจ๋“  ํ–‰์„ ๋„๋Š”๋ฐ ํ–‰๋งˆ๋‹ค .์ผ๋™์•ˆ ๊ณ„์† swap์„ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์œ„์— ๋–  ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์ž๋™์œผ๋กœ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๊ณ  ํ•„์š”ํ•œ ๋ถ€๋ถ„์— .์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ 2048 easy ๋ฒ„์ „์—์„œ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ทธ๋ƒฅ ์ƒˆ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  ์ง‘์–ด๋„ฃ์„ ์ˆ˜๋„ ์žˆ๋‹ค(์ด๊ฒŒ ํœ ์”ฌ ์‰ฝ๋‹ค) ๊ทธ ๋‹ค์Œ 2์ฐจ์› ๋ฐฐ์—ด์„ ๋Œ๋ฉด์„œ ๋ฌธ์ž์—ด์ด ์žˆ๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” bfs๋ฅผ ๋Œ์•„ ํŽ‘ํ•˜๋Š” ๋ถ€๋ถ„์„ ์„ค์ •ํ•˜๊ณ  ๊ทธ๋ƒฅ 2์ฐจ์› ๋ฐฐ์—ด์„ ๋Œ๋ฉด์„œ ๋„ฃ์–ด์ฃผ๊ณ  ๋๋‚ธ๋‹ค(๊ตณ์ด ๋‹ค ๋‹ค์‹œ bfs๋ฅผ ๋Œ๋ฆฐ ๋‚˜๋ž˜๊ธฐ..) ํ•œ ๋ถ€๋ถ„์„ ๋‹ค ๋Œ๊ณ ๋‚˜๋ฉด visํ•จ์ˆ˜๋ฅผ resetํ•ด์ฃผ๊ณ  ๋‹ค์‹œ ํŽ‘์ด ๊ฐ€๋Šฅํ•  ๋™์•ˆ ๋ˆ๋‹ค.

๐Ÿงš๐Ÿป REMEMBER FOR SURE

  • ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์ง‘์–ด ๋„ฃ๋Š” ๊ฒŒ ํ›จ์”ฌ ์‰ฌ์šธ ์ˆ˜ ์žˆ๋‹ค. ์ง€๊ธˆ์ฒ˜๋Ÿผ ํ•œ ๋ฒˆ์— ๊ฐ’์„ ๋‘ ๋ฒˆ์ด๋‚˜ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”
  • ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋Œ์ž main์—์„œ for๋ฌธ์„ ๋„๋Š” ๊ฒฝ์šฐ ๊ฐ„๋‹จํ•ด ์งˆ ์ˆ˜ ์žˆ๋‹ค.

โœ”๏ธ ์ฝ”๋“œ

#include <bits/stdc++.h>
using namespace std;

bool    isPuyo;
bool    vis[12][6];
string  board[12];
int     dx[] = {1, 0, -1, 0};
int     dy[] = {0, 1, 0, -1};
int     ans;

void    reset()
{
    for(int i = 0; i < 12; ++i)
        for(int j = 0; j < 6; ++j)
            vis[i][j] = false;
}

void    puyo(int x, int y)
{
    vis[x][y] = true;
    char color = board[x][y];
    queue<pair<int, int> > q;
    vector<pair<int, int> > tmp;
    q.push({x, y});
    tmp.push_back({x, y});
    while (!q.empty())
    {
        pair<int, int>  cur = q.front();
        q.pop();
        for (int i = 0; i < 4; i++)
        {
            int nx = cur.first + dx[i];
            int ny = cur.second + dy[i];
            if (nx < 0 || ny < 0 || nx >= 12 || ny >= 6 || vis[nx][ny] || board[nx][ny] != color)
                continue;
            vis[nx][ny] = true;
            q.push({nx, ny});
            tmp.push_back({nx, ny});
        }
    }

    if (tmp.size() >= 4)
    {
        isPuyo = true;
        for (auto cur : tmp)
            board[cur.first][cur.second] = '.';
    }
}

int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    for (int i = 0; i < 12; i++)
        cin >> board[i];

    do{
        isPuyo = false;
        //drag downํ•˜๋Š” ๋ถ€๋ถ„
        for (int j = 0; j < 6; j++)
        {
            for (int i = 10; i >= 0; i--)
            {
                int tmp = i;
                while (tmp < 11 && board[tmp + 1][j] == '.')
                {
                    swap(board[tmp][j], board[tmp + 1][j]);
                    tmp++;
                }
            }
        }

        for (int i = 0; i < 12; i++)
            for (int j = 0; j < 6; j++)
                if (!vis[i][j] && board[i][j] != '.')
                    puyo(i, j);
        
        if (isPuyo)
            ans++;
        reset();
    }while (isPuyo);
    cout << ans;
}

0๊ฐœ์˜ ๋Œ“๊ธ€