๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์ค€/Gold

[BOJ] 21611 : ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋ธ”๋ฆฌ์ž๋“œ

by Jaeguk 2022. 6. 3.
๋ฌธ์ œ ๋งํฌ

21611๋ฒˆ: ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋ธ”๋ฆฌ์ž๋“œ (acmicpc.net)

 

21611๋ฒˆ: ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋ธ”๋ฆฌ์ž๋“œ

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๋Š” ํŒŒ์ด์–ด๋ณผ, ํ† ๋„ค์ด๋„, ํŒŒ์ด์–ด์Šคํ†ฐ, ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ, ๋น„๋ฐ”๋ผ๊ธฐ ๋งˆ๋ฒ•์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋Š˜ ์ƒˆ๋กœ ๋ฐฐ์šด ๋งˆ๋ฒ•์€ ๋ธ”๋ฆฌ์ž๋“œ์ด๊ณ , ํฌ๊ธฐ๊ฐ€ N×N์ธ ๊ฒฉ์ž์—์„œ ์—ฐ์Šตํ•˜๋ ค๊ณ  ํ•œ๋‹ค. N์€ ํ•ญ์ƒ ํ™€์ˆ˜์ด๊ณ , (

www.acmicpc.net

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด ์‹œ๋ฆฌ์ฆˆ ไธญ ๋ธ”๋ฆฌ์ž๋“œ ํŽธ.

์—ฌํƒœ ํ’€์—ˆ๋˜ ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด ๋ฌธ์ œ์ค‘์— ์ œ์ผ ๊นŒ๋‹ค๋กœ์› ๋˜ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

ํ’€์ด
 

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๋Š” "๋ธ”๋ผ์ž๋“œ"๋ผ๋Š” ์ƒˆ๋กœ์šด ๋งˆ๋ฒ•์„ ๋ฐฐ์› ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ N x N ๊ฒฉ์žํŒ์—์„œ ์—ฐ์Šต์ค‘์ด๋‹ค.

๊ฒฉ์žํŒ์˜ ํฌ๊ธฐ๋Š” ํ•ญ์ƒ ํ™€์ˆ˜์ด๋ฉฐ ์ƒ์–ด๋Š” ์ฒ˜์Œ์— ((N+1)/2, (N+1)/2)์— ์žˆ๋‹ค. ์ฆ‰ ๊ฒฉ์žํŒ์˜ ํ•œ๊ฐ€์šด๋ฐ์— ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

๊ฒฉ์ž์—์„œ ์‹ค์„ ์€ ๋ฒฝ์„ ์˜๋ฏธํ•˜๊ณ  ์ ์„  ์‚ฌ์ด๋Š” ์ง€๋‚˜๋‹ค๋‹ ์ˆ˜ ์žˆ๋‹ค.

ํฌ๊ธฐ๊ฐ€ 5์ธ (N = 5) ๊ฒฉ์žํŒ์„ ์˜ˆ์‹œ๋กœ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฉ์žํŒ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ •ํ•ด์ง„๋‹ค. ์ƒ์–ด์˜ ์ขŒ์ธก์„ ์‹œ์ž‘์œผ๋กœ ๋น™๊ธ€๋น™๊ธ€ ๋Œ์•„๊ฐ€๋ฉด์„œ ๋ฒˆํ˜ธ๊ฐ€ ์„ ์ •๋œ๋‹ค.

๋ฒˆํ˜ธ ๋ฐฐ์น˜๊ฐ€ ์ด๋ ‡๊ฒŒ ๋ผ์žˆ์–ด์„œ ๊ตฌํ˜„์ด ๋ณต์žกํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

 

์ž„์˜์˜ ๊ฒฉ์ž ์นธ์„ ์„ ํƒํ–ˆ์„ ๋•Œ, ๋‹ค์Œ ๋ฒˆํ˜ธ ์นธ์ด ์–ด๋””์ธ์ง€๋ฅผ ๋ฐ”๋กœ ์ฐพ๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ฒ˜์Œ์— N์„ ์ž…๋ ฅ๋ฐ›์€ ํ›„์— ๊ฒฉ์ž ์นธ์„ ์ •ํ•ด์ง„ ์ˆœ์„œ๋Œ€๋กœ ๋Œ๋ฉด์„œ Next๋ผ๋Š” 2์ฐจ์› pair<int,int> ๋ฐฐ์—ด์— ๋‹ค์Œ์นธ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•ด๋‘์—ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž„์˜์˜ ์นธ (r,c) ์— ๋Œ€ํ•ด์„œ ๋‹ค์Œ ์นธ์˜ ์ธ๋ฑ์Šค๊ฐ€ ์–ด๋””์ธ์ง€ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋นˆ์นธ์ด ์ƒ๊ธฐ๋ฉด ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ์นธ์œผ๋กœ ๊ตด๋Ÿฌ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์ž„์˜์˜ ์นธ์— ๋Œ€ํ•ด ์ด์ „ ๋ฒˆํ˜ธ ์นธ์ด ์–ด๋””์ธ์ง€๋„ ์•Œ์•„์•ผํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ Before๋ผ๋Š” 2์ฐจ์› pair<int,int> ๋ฐฐ์—ด๋„ ์„ ์–ธํ•ด์„œ ์ด์ „์นธ์˜ ์ธ๋ฑ์Šค๋„ ์ €์žฅํ–ˆ๋‹ค.

 

์ƒ์–ด์˜ ๋ช…๋ น ์ดํ›„์˜ ๊ตฌ์Šฌ์˜ ์ง„ํ–‰์„ ๋ณด๋ฉด

๋ธ”๋ฆฌ์ž๋“œ -> ๊ตฌ์Šฌ ์žฌ๋ฐฐ์—ด -> ํญ๋ฐœ -> ์žฌ๋ฐฐ์—ด -> ๋ณ€ํ™” ์ˆœ์œผ๋กœ ๋ฐœ์ƒํ•˜๊ณ , ํญ๋ฐœ ๊ณผ์ •์€ ํญ๋ฐœํ•  ๊ตฌ์Šฌ์ด ์—†์„ ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ๋ฐœ์ƒํ•œ๋‹ค.

์œ„์˜ ๊ณผ์ •์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์–ด๋–ค ์ •๋ณด๋“ค์ด ํ•„์š”ํ• ๊นŒ??

1. ํ˜„์žฌ ๊ฒฉ์žํŒ์˜ ์ƒํ™ฉ

๊ฐ ์นธ๋งˆ๋‹ค ํ˜„์žฌ ๊ตฌ์Šฌ์ด ๋“ค์–ด์žˆ๋Š”์ง€, ๋น„์–ด์žˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ๋“ค์–ด์žˆ๋‹ค๋ฉด ์–ด๋–ค ๊ตฌ์Šฌ์ด ๋“ค์–ด์žˆ๋Š” ์ง€๋ฅผ ํ•ญ์ƒ ํŒŒ์•…ํ•˜๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ณผ์ •์ด ์ง„ํ–‰๋จ์— ๋”ฐ๋ผ ๊ฒฉ์žํŒ์„ ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

A[50][50] ์˜ ์ •์ˆ˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ๊ฒฉ์žํŒ์˜ ์ƒํ™ฉ์„ ์ €์žฅํ–ˆ๋‹ค.

2. ์•ž์„œ ๋งํ–ˆ๋˜ ๊ฐ ์นธ๋“ค์˜ ๋‹ค์Œ์นธ๊ณผ ์ด์ „์นธ์„ ์•Œ๋ ค์ฃผ๋Š” Next, Before ๋ฐฐ์—ด

3. ๋ฐฉํ–ฅ ๋ฐฐ์—ด

pair<int, int> Dir[] = { {0,0}, {-1,0}, {1,0}, {0,-1}, {0,1} };

๋ฐฉํ–ฅ์€ 1๋ฒˆ~4๋ฒˆ 4๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ 0๋ฒˆ ์ธ๋ฑ์Šค์—๋Š” ํŽธ์˜๋ฅผ ์œ„ํ•ด ์ž„์˜์˜ ๊ฐ’์„ ๋„ฃ์–ด๋‘์—ˆ๋‹ค.

ํ•„์š”ํ•œ ์ •๋ณด๋“ค์€ ์ด์ •๋„๊ฐ€ ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

  • Next, Before ๋ฐฐ์—ด ๊ฐ’ ๋Œ€์ž…

๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๊ฒฉ์žํŒ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ž˜ ๋“ค์—ฌ๋‹ค๋ณด์ž.

์ƒ์–ด์˜ ์™ผ์ชฝ ๋Œ€๊ฐ์„ ์ธ 2๋ฒˆ๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ถœ๋ฐœํ•ด์„œ 2,2,3,3,4,4,5,5,6,6,.. ์นธ์„ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐฉํ–ฅ์ด ์ „ํ™˜๋œ๋‹ค๋Š” ๊ทœ์น™์ด ์žˆ๋‹ค. ์ด ๊ทœ์น™์„ ์ด์šฉํ•ด์„œ Next๋ฐฐ์—ด๊ณผ Before ๋ฐฐ์—ด์— ๊ฐ’์„ ์ง€์ •ํ•ด์ค€๋‹ค.

  • ๋ธ”๋ฆฌ์ž๋“œ ๋งˆ๋ฒ•

๋ธ”๋ฆฌ์ž๋“œ๋Š” ๊ตฌํ˜„์ด ์‰ฝ๋‹ค. d ๋ฐฉํ–ฅ์œผ๋กœ ์ƒ์–ด์—์„œ s๋งŒํผ ๋–จ์–ด์ง„ ์นธ๊นŒ์ง€ ์ผ์ž๋กœ ๊ตฌ์Šฌ์„ ํŒŒ๊ดด์‹œํ‚ค๋ฉด ๋œ๋‹ค.

ํŒŒ๊ดด๋œ ๊ตฌ์Šฌ์€ A๋ฐฐ์—ด์—์„œ ๊ฐ’์„ 0์œผ๋กœ ๋ณ€๊ฒฝ์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค.

  • ์žฌ๋ฐฐ์—ด

๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ์นธ๋ถ€ํ„ฐ ํฐ ์นธ์œผ๋กœ ์ด๋™ํ•˜๋ฉด์„œ ํ•ด๋‹น ์นธ์— ๊ตฌ์Šฌ์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๊ตฌ์Šฌ์„ ๋นˆ์นธ์ด ์—†์„ ๋•Œ ๊นŒ์ง€ ๋•ก๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์›๋ž˜ ๊ตฌ์Šฌ์ด ์žˆ๋˜ ์นธ์€ ๋นˆ ์นธ์ด ๋œ๋‹ค.

  • ํญ๋ฐœ

1๋ฒˆ ์นธ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์นธ๊นŒ์ง€ ๋Œ๋ฉด์„œ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์€ ๊ตฌ์Šฌ๋“ค์ด ๋ถ™์–ด์žˆ์œผ๋ฉด ๋ชจ๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ฃน์˜ ํฌ๊ธฐ๊ฐ€ 4์ด์ƒ์ด๋ผ๋ฉด ํ•ด๋‹น ๊ทธ๋ฃน์˜ ๊ตฌ์Šฌ๋“ค์„ ํญ๋ฐœ์‹œํ‚จ๋‹ค.

์ด๋•Œ (ํŒŒ๊ดด๋œ ๊ตฌ์Šฌ์˜ ๋ฒˆํ˜ธ * ๊ตฌ์Šฌ์˜ ์ˆ˜) ์˜ ์ดํ•ฉ์ด ์šฐ๋ฆฌ๊ฐ€ ์ถœ๋ ฅํ•ด์•ผํ•  ์ •๋‹ต์ด๋‹ค.

ํญ๋ฐœ -> ์žฌ๋ฐฐ์—ด ๊ณผ์ •์„ ํญ๋ฐœํ•  ๊ตฌ์Šฌ์ด ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

  • ๋ณ€ํ™”

๋ณ€ํ™” ๊ณผ์ • ์—ญ์‹œ 1๋ฒˆ ์นธ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์นธ๊นŒ์ง€ ๋Œ๋ฉด์„œ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์€ ๊ตฌ์Šฌ๋“ค์„ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ๊ณ , ๊ทธ๋ฃน์— ๋“ค์–ด์žˆ๋Š” ๊ตฌ์Šฌ์˜ ๋ฒˆํ˜ธ์™€ ๊ตฌ์Šฌ์˜ ์ˆ˜๋ฅผ ์ž„์˜์˜ ๋ฒกํ„ฐ์— ์ €์žฅํ•ด๋‘”๋‹ค. ์ด๋•Œ ๊ทธ๋ฃน์˜ ํฌ๊ธฐ๋Š” ์ƒ๊ด€์—†๋‹ค.

๋ชจ๋“  ๊ตฌ์Šฌ๋“ค์„ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์€ ํ›„, ์ž„์˜์˜ ๋ฒกํ„ฐ์— ๋“ค์–ด์žˆ๋Š” ์ •๋ณด๋ฅผ ์ด์šฉํ•ด์„œ ๊ฒฉ์ž ์นธ์˜ ๊ตฌ์Šฌ๋“ค์„ ๋ณ€ํ™”์‹œ์ผœ์ค€๋‹ค.

 
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <deque>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 998244353
using namespace std;
typedef long long ll;
typedef priority_queue<pair<intint>vector<pair<intint>>, greater<pair<intint>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 50 + 5;
int N, M;
pair<intint> Dir[] = { {0,0}, {-1,0}, {1,0}, {0,-1}, {0,1} };
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };
int A[MAX_N][MAX_N];
pair<intint> Shark;
pair<intint> Next[MAX_N][MAX_N];
pair<intint> Before[MAX_N][MAX_N];
int Score;
 
void Blizzard(intint);
void Init();
void Arrange();
bool Explode();
void Change();
 
void Print_A() {
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++)
            cout << A[i][j] << " ";
        cout << "\n";
    }
    cout << "\n";
}
 
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> M;
    Init();
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            cin >> A[i][j];
        }
    }
    for (int i = 0; i < M; i++) {
        int d, s;
        cin >> d >> s;
        Blizzard(d, s);
        Arrange();
        while(Explode()) Arrange();
        Change();
    }
    cout << Score << "\n";
    return 0;
}
 
void Init() {
    Shark = { (1 + N) / 2, (1 + N) / 2 };
    pair<intint> now = { Shark.first + 1, Shark.second - 1 };
    Next[Shark.first][Shark.second - 1= now;
    Before[Shark.first][Shark.second - 1= {-1,-1};
    Before[now.first][now.second] = { Shark.first, Shark.second - 1 };
    int direct = 1;
    for (int i = 2; i <= N; i++) {
        for (int k = 1; k <= 2; k++) {
            for (int j = 1; j <= i; j++) {
                pair<intint> next = { now.first + dy[direct], now.second + dx[direct] };
                Next[now.first][now.second] = next;
                Before[next.first][next.second] = now;
                now = next;
                if (now.first == 1 && now.second == 1)
                    break;
            }
            if (now.first == 1 && now.second == 1)
                break;
            direct++;
            direct %= 4;
        }
        if (now.first == 1 && now.second == 1)
            break;
    }
    Next[1][1= { -1,-1 };
}
 
void Blizzard(int d, int s) {
    for (int i = 1; i <= min((int)(N/2),s); i++) {
        pair<intint> next = { Shark.first + Dir[d].first * i, Shark.second + Dir[d].second * i };
        A[next.first][next.second] = 0;
    }
}
 
void Arrange() {
    pair<intint> now = { Shark.first + 1, Shark.second - 1 };
    while(true){
        if (now.first == -1 && now.second == -1)
            break;
        if (A[now.first][now.second] == 0) {
            now = Next[now.first][now.second];
            continue;
        }
        pair<intint> to = now;
        while (true) {
            pair<intint> before = Before[to.first][to.second];
            if (before.first == -1 && before.second == -1)
                break;
 
            if (A[before.first][before.second] == 0)
                to = before;
            else break;
        }
        if (to.first == now.first && to.second == now.second) {
            now = Next[now.first][now.second];
            continue;
        }
        A[to.first][to.second] = A[now.first][now.second];
        A[now.first][now.second] = 0;
    }
}
 
bool Explode() {
    pair<int,int> now = { Shark.first, Shark.second - 1 };
    vector<pair<intint>> group;
    bool chk = false;
    for (int i = 1; i <= N * N - 1; i++) {
        if (A[now.first][now.second] == 0)
            break;
        pair<intint> next = Next[now.first][now.second];
        if (A[now.first][now.second] == A[next.first][next.second]) {
            group.push_back(now);
            now = next;
            continue;
        }
        else {
            group.push_back(now);
            if (group.size() >= 4) {
                Score += A[now.first][now.second] * group.size();
                for (int j = 0; j < group.size(); j++) {
                    A[group[j].first][group[j].second] = 0;
                }
                chk = true;
            }
            now = next;
            group.clear();
        }
    }
    return chk;
}
 
void Change() {
    vector<pair<intint>> Group;
    pair<intint> now = { Shark.first, Shark.second - 1 };
    int cnt = 1;
    for (int i = 1; i <= N * N - 1; i++) {
        if (A[now.first][now.second] == 0)
            break;
        pair<intint> next = Next[now.first][now.second];
        if (A[now.first][now.second] == A[next.first][next.second])
            cnt++;
        else{
            Group.push_back({ cnt,A[now.first][now.second] });
            cnt = 1;
        }
        now = next;
    }
    memset(A, 0sizeof(A));
 
    now = { Shark.first, Shark.second - 1 };
    for (int i = 0; i < Group.size(); i++) {
        A[now.first][now.second] = Group[i].first;
        pair<intint> next = Next[now.first][now.second];
        if (next.first == -1)
            break;
        A[next.first][next.second] = Group[i].second;
        now = Next[next.first][next.second];
        if (now.first == -1)
            break;
    }
}
cs

์ฝ”๋“œ์˜ ๊ธธ์ด๊ฐ€ ๊ฝค ๊ธธ์–ด์กŒ๋‹ค

์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์— ์ด ์ •๋„ ๊ตฌํ˜„๋ฌธ์ œ๊ฐ€ ๋‚˜์˜ค๋ฉด ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ ค๋„ ํ’€์–ด์•ผํ• ๊นŒ ๋„˜๊ฒจ์•ผํ• ๊นŒ,,

728x90