๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ

[C++/BOJ] 21610 : ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋น„๋ฐ”๋ผ๊ธฐ (์‹œ๋ฎฌ๋ ˆ์ด์…˜)

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

๋ฌธ์ œ

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๋Š” ํŒŒ์ด์–ด๋ณผํ† ๋„ค์ด๋„, ํŒŒ์ด์–ด์Šคํ†ฐ, ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ ๋งˆ๋ฒ•์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋Š˜ ์ƒˆ๋กœ ๋ฐฐ์šด ๋งˆ๋ฒ•์€ ๋น„๋ฐ”๋ผ๊ธฐ์ด๋‹ค. ๋น„๋ฐ”๋ผ๊ธฐ๋ฅผ ์‹œ์ „ํ•˜๋ฉด ํ•˜๋Š˜์— ๋น„๊ตฌ๋ฆ„์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋Š˜์€ ๋น„๋ฐ”๋ผ๊ธฐ๋ฅผ ํฌ๊ธฐ๊ฐ€ N×N์ธ ๊ฒฉ์ž์—์„œ ์—ฐ์Šตํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ฒฉ์ž์˜ ๊ฐ ์นธ์—๋Š” ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ํ•˜๋‚˜ ์žˆ๊ณ , ๋ฐ”๊ตฌ๋‹ˆ๋Š” ์นธ ์ „์ฒด๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค. ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌผ์˜ ์–‘์—๋Š” ์ œํ•œ์ด ์—†๋‹ค. (r, c)๋Š” ๊ฒฉ์ž์˜ rํ–‰ c์—ด์— ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ์˜๋ฏธํ•˜๊ณ , A[r][c]๋Š” (r, c)์— ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฌผ์˜ ์–‘์„ ์˜๋ฏธํ•œ๋‹ค.

๊ฒฉ์ž์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์œ— ์นธ์€ (1, 1)์ด๊ณ , ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋žซ ์นธ์€ (N, N)์ด๋‹ค. ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๋Š” ์—ฐ์Šต์„ ์œ„ํ•ด 1๋ฒˆ ํ–‰๊ณผ N๋ฒˆ ํ–‰์„ ์—ฐ๊ฒฐํ–ˆ๊ณ , 1๋ฒˆ ์—ด๊ณผ N๋ฒˆ ์—ด๋„ ์—ฐ๊ฒฐํ–ˆ๋‹ค. ์ฆ‰, N๋ฒˆ ํ–‰์˜ ์•„๋ž˜์—๋Š” 1๋ฒˆ ํ–‰์ด, 1๋ฒˆ ํ–‰์˜ ์œ„์—๋Š” N๋ฒˆ ํ–‰์ด ์žˆ๊ณ , 1๋ฒˆ ์—ด์˜ ์™ผ์ชฝ์—๋Š” N๋ฒˆ ์—ด์ด, N๋ฒˆ ์—ด์˜ ์˜ค๋ฅธ์ชฝ์—๋Š” 1๋ฒˆ ์—ด์ด ์žˆ๋‹ค.

๋น„๋ฐ”๋ผ๊ธฐ๋ฅผ ์‹œ์ „ํ•˜๋ฉด (N, 1), (N, 2), (N-1, 1), (N-1, 2)์— ๋น„๊ตฌ๋ฆ„์ด ์ƒ๊ธด๋‹ค. ๊ตฌ๋ฆ„์€ ์นธ ์ „์ฒด๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค. ์ด์ œ ๊ตฌ๋ฆ„์— ์ด๋™์„ M๋ฒˆ ๋ช…๋ นํ•˜๋ ค๊ณ  ํ•œ๋‹ค. i๋ฒˆ์งธ ์ด๋™ ๋ช…๋ น์€ ๋ฐฉํ–ฅ di๊ณผ ๊ฑฐ๋ฆฌ si๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋ฐฉํ–ฅ์€ ์ด 8๊ฐœ์˜ ๋ฐฉํ–ฅ์ด ์žˆ์œผ๋ฉฐ, 8๊ฐœ์˜ ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•œ๋‹ค. 1๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ←, โ†–, ↑, โ†—, →, โ†˜, ↓, โ†™ ์ด๋‹ค. ์ด๋™์„ ๋ช…๋ นํ•˜๋ฉด ๋‹ค์Œ์ด ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰๋œ๋‹ค.

  1. ๋ชจ๋“  ๊ตฌ๋ฆ„์ด di ๋ฐฉํ–ฅ์œผ๋กœ si์นธ ์ด๋™ํ•œ๋‹ค.
  2. ๊ฐ ๊ตฌ๋ฆ„์—์„œ ๋น„๊ฐ€ ๋‚ด๋ ค ๊ตฌ๋ฆ„์ด ์žˆ๋Š” ์นธ์˜ ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋œ ๋ฌผ์˜ ์–‘์ด 1 ์ฆ๊ฐ€ํ•œ๋‹ค.
  3. ๊ตฌ๋ฆ„์ด ๋ชจ๋‘ ์‚ฌ๋ผ์ง„๋‹ค.
  4. 2์—์„œ ๋ฌผ์ด ์ฆ๊ฐ€ํ•œ ์นธ (r, c)์— ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ ๋งˆ๋ฒ•์„ ์‹œ์ „ํ•œ๋‹ค. ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ ๋งˆ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ๊ฑฐ๋ฆฌ๊ฐ€ 1์ธ ์นธ์— ๋ฌผ์ด ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ์˜ ์ˆ˜๋งŒํผ (r, c)์— ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ์˜ ๋ฌผ์ด ์–‘์ด ์ฆ๊ฐ€ํ•œ๋‹ค.
    • ์ด๋•Œ๋Š” ์ด๋™๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ์นธ์€ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ๊ฑฐ๋ฆฌ๊ฐ€ 1์ธ ์นธ์ด ์•„๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, (N, 2)์—์„œ ์ธ์ ‘ํ•œ ๋Œ€๊ฐ์„  ์นธ์€ (N-1, 1), (N-1, 3)์ด๊ณ , (N, N)์—์„œ ์ธ์ ‘ํ•œ ๋Œ€๊ฐ์„  ์นธ์€ (N-1, N-1)๋ฟ์ด๋‹ค.
  5. ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋œ ๋ฌผ์˜ ์–‘์ด 2 ์ด์ƒ์ธ ๋ชจ๋“  ์นธ์— ๊ตฌ๋ฆ„์ด ์ƒ๊ธฐ๊ณ , ๋ฌผ์˜ ์–‘์ด 2 ์ค„์–ด๋“ ๋‹ค. ์ด๋•Œ ๊ตฌ๋ฆ„์ด ์ƒ๊ธฐ๋Š” ์นธ์€ 3์—์„œ ๊ตฌ๋ฆ„์ด ์‚ฌ๋ผ์ง„ ์นธ์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค.

M๋ฒˆ์˜ ์ด๋™์ด ๋ชจ๋‘ ๋๋‚œ ํ›„ ๋ฐ”๊ตฌ๋‹ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ฌผ์˜ ์–‘์˜ ํ•ฉ์„ ๊ตฌํ•ด๋ณด์ž.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N, M์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. r๋ฒˆ์งธ ํ–‰์˜ c๋ฒˆ์งธ ์ •์ˆ˜๋Š” A[r][c]๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” ์ด๋™์˜ ์ •๋ณด di, si๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— M๋ฒˆ์˜ ์ด๋™์ด ๋ชจ๋‘ ๋๋‚œ ํ›„ ๋ฐ”๊ตฌ๋‹ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ฌผ์˜ ์–‘์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.


 

๊ณจ๋“œ 5.

์ด๊ฒƒ๋„ ์‚ผ์„ฑ sw ๊ธฐ์ถœ๋ฌธ์ œ์ด๋‹ค~~ ์‹œ๋ฎฌ๋ ˆ์ด์…˜~~ ๋นก๊ตฌํ˜„~~~

์ผ๋‹จ ์ฒซ ์ด๋™์ด ์•Œ๋งž๊ฒŒ ๋‚˜์˜ค๊ธฐ๊นŒ์ง€ ๋”ฑ 1์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค!

๋‚˜๋จธ์ง„ ํ‹€๋ฆผใ…‹ใ…‹

 

 

์ฒซ๋ฒˆ์งธ ๊ณผ์ •์ด ๋งž๋Š”๊ฑธ ๋ณด๋‹ˆ, ๋ญ”๊ฐ€ ์ดˆ๊ธฐํ™”๋ฅผ ์•ˆํ•ด์ค€ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์‚˜์ด ๊ฐ•ํ•˜๊ฒŒ ์™”๋‹ค.

๊ทธ๋ž˜์„œ ์ฐพ์•„๋ณด๋‹ˆ cloud ๋ฒกํ„ฐ ์ดˆ๊ธฐํ™”๋ฅผ ์•ˆํ–ˆ์—ˆ์Œ.

cloud.clear()ํ•˜๊ณ  ์žฌ๋„์ „!

 

๋‹ต๊ณผ ์กฐ๊ธˆ ๋” ๋น„์Šทํ•ด์ง€๊ธด ํ–ˆ๋Š”๋ฐ ๊ทธ๋ž˜๋„ ํ‹€๋ฆฌ๋‹ค. ์–ด๋””๊ฐ€ ๋ฌธ์ œ์ผ๊นŒ

 

์ฒซ๋ฒˆ์งธ ์‹ค์ˆ˜ : ์ขŒํ‘œ ์‹ค์ˆ˜..! dy ๋ถ€ํ˜ธ๋ฅผ ๋ฐ˜๋Œ€๋กœ ํ–ˆ์—ˆ์Œ ใ… ใ… 

int dx[8] = {-1,-1,0,1,1,1,0,-1};
int dy[8] = {0,-1,-1,-1,0,1,1,1};

 

๋‘๋ฒˆ์งธ ์‹ค์ˆ˜ : moveCloud ํ•จ์ˆ˜์—์„œ ์ขŒํ‘œ์ •๋ณด๋งŒ ๊ธฐ์–ตํ•ด๋†จ๋Š”๋ฐ

ํ•จ์ˆ˜ ๋งˆ์ง€๋ง‰์—,,, ๊ทธ ์ขŒํ‘œ์— ๊ตฌ๋ฆ„์ด ์žˆ์œผ๋ฉด ์—†์• ๋ฒ„๋ฆฌ๋Š” ๋ฐ”๋žŒ์— ๋‹ต์ด ์ด์ƒํ•˜๊ฒŒ ๋‚˜์™”๋‹ค.

 

์–ด์จŒ๋“  ์ด๊ฑด ๋‚˜ ์Šค์Šค๋กœ์˜ ํž˜์œผ๋กœ 2์‹œ๊ฐ„๋งŒ์— ํ’€์–ด๋ƒˆ๋‹ค!!! ์™•๋ฟŒ๋“ฏ

 

 

๋‚˜์˜ ํ’€์ด

// ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋น„๋ฐ”๋ผ๊ธฐ
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;

int n;
int m;
int map[51][51][2]; // 0: ๋น„๊ตฌ๋ฆ„ ์—ฌ๋ถ€, 1: ๋ฌผ์˜ ์–‘
int ds[101][2];

int dx[8] = {-1,-1,0,1,1,1,0,-1};
int dy[8] = {0,-1,-1,-1,0,1,1,1};
queue<pair<int, int>> q;
vector<pair<int, int>> cloud;
int gx[4] = {1, -1, 1, -1};
int gy[4] = {-1, -1, 1, 1};

void moveCloud(int idx, int j, int k, int moveY, int moveX){
    
    // ๊ตฌ๋ฆ„์ด s๋งŒํผ ์ด๋™
    for (int i = 0; i < ds[idx][1]; ++i){
        if(j+moveY < 1){
            j = n;
        } else if(j+moveY > n){
            j = 1;
        } else {
            j = j + moveY;
        }

        if(k+moveX < 1){
            k = n;
        } else if(k+moveX > n){
            k = 1;
        } else {
            k = k + moveX;
        }
    }
    // ๋น„๊ฐ€ ๋‚ด๋ฆผ
    map[j][k][1] += 1;
    q.push({j, k});
    
    // ๊ตฌ๋ฆ„ ์‚ฌ๋ผ์ง
    // map[j][k][0] = 0; // ์ด๊ฑฐ๋•Œ๋ฌธ์— ์• ๋จน์Œ
    cloud.push_back({j, k});
}

void copyWater(){
    while (!q.empty()){
        int cnt = 0;
        pair<int, int> a = q.front();
        q.pop();
        for (int d = 0; d < 4; ++d){
            int ny = a.first + gy[d];
            int nx = a.second + gx[d];
            if(nx<1 || ny<1 || nx>n || ny>n) continue;
            if(map[ny][nx][1]) cnt++;
        }
        map[a.first][a.second][1] += cnt;
    }
    
}

void makeCloud(){
    
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= n; ++j){
            bool had = false;
            for (int k = 0; k < cloud.size(); ++k){
                if(cloud[k] == make_pair(i,j)) {
                    had = true;
                    break;
                }
            }

            if (!had && map[i][j][1] > 1){
                map[i][j][0] = 1;
                map[i][j][1] -= 2;
            }
        }
    }
    cloud.clear();
}

int main(){
    cin >> n >> m;
    for (int i = 1; i <= n;++i){
        for (int j = 1; j <= n; ++j){
            cin >> map[i][j][1];
        }
    }

    for (int i = 0; i < m;++i){
        cin >> ds[i][0] >> ds[i][1];
    }

    map[n][1][0] = 1;
    map[n][2][0] = 1;
    map[n-1][1][0] = 1;
    map[n-1][2][0] = 1;

    for (int i = 0; i < m; ++i){

        int moveX = dx[ds[i][0] - 1];
        int moveY = dy[ds[i][0] - 1];

        for (int j = 1; j <= n; ++j){ // ๊ตฌ๋ฆ„ ์ด๋™
            for (int k = 1; k <= n; ++k){
                if(map[j][k][0] == 1){
                    map[j][k][0] = 0;
                    moveCloud(i, j, k, moveY, moveX);
                }
            }
        }
        copyWater();
        makeCloud();
    }

    int sum = 0;
    for (int i = 1; i <= n;++i){
        for (int j = 1; j <= n;++j){
            sum += map[i][j][1];
        }
    }
    cout << sum;
}