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

[BOJ] 21610 : ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋น„๋ฐ”๋ผ๊ธฐ

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

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

 

21610๋ฒˆ: ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋น„๋ฐ”๋ผ๊ธฐ

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

www.acmicpc.net

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด ์‹œ๋ฆฌ์ฆˆ ไธญ ๋น„๋ฐ”๋ผ๊ธฐ ํŽธ

๊ณจ๋“œ5ํ‹ฐ์–ด๋กœ ๋‚˜์™€์žˆ๋Š”๋ฐ ์™œ์ด๋ ‡๊ฒŒ ํ—ค๋งธ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.

ํ’€์ด

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๋Š” ๋น„๋ฐ”๋ผ๊ธฐ ์Šคํ‚ฌ์„ ๋ฐฐ์šฐ๊ฒŒ ๋๋‹ค.

N x N ๊ฒฉ์žํŒ์—์„œ ๋น„๋ฐ”๋ผ๊ธฐ ์Šคํ‚ฌ์„ ์—ฐ์Šต์ค‘์ด๋‹ค. ๋น„๋ฐ”๋ผ๊ธฐ๋ฅผ ์‹œ์ „ํ•˜๋ฉด ์ดˆ๊ธฐ์—  (N, 1), (N, 2), (N-1, 1), (N-1, 2) ์ขŒํ‘œ์— ๋น„๊ตฌ๋ฆ„์ด 4๊ฐœ ์ƒ๊ธด๋‹ค.

์ƒ์–ด๋Š” M๋ฒˆ ๋™์•ˆ ๋น„๊ตฌ๋ฆ„์— ๋ช…๋ น์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๊ณ , ์ด๋™๋ฐฉํ–ฅ์€ 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์—์„œ ๊ตฌ๋ฆ„์ด ์‚ฌ๋ผ์ง„ ์นธ์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์–ด๊ฐ€ ๋ช…๋ น์„ ๋‚ด๋ฆฐ ํ›„์˜ ๋น„๋ฐ”๋ผ๊ธฐ ์ง„ํ–‰์„ ๋ช…์‹œ ํ•ด๋‘์—ˆ๋‹ค.

์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€๊ฒฝํ•ด์•ผํ• ๊นŒ?

  1. ๋ชจ๋“  ๊ตฌ๋ฆ„์˜ ์œ„์น˜์— ๋Œ€ํ•œ ์ •๋ณด

๊ตฌ๋ฆ„์˜ ์œ„์น˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์•Œ์•„์•ผ ๊ตฌ๋ฆ„์„ ์ด๋™์‹œํ‚ค๊ณ  ๊ตฌ๋ฆ„์ด ์žˆ๋Š” ์œ„์น˜์— ๋น„๋ฅผ ๋‚ด๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ๋ฆ„์— ๋Œ€ํ•œ ์ •๋ณด๋Š” Clouds ๋ผ๋Š” ๋ฒกํ„ฐ์— ๊ตฌ๋ฆ„์˜ ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ–ˆ๋‹ค.

  2. ์ œ์ผ ์ตœ๊ทผ์— ๊ตฌ๋ฆ„์ด ์–ด๋””์— ์กด์žฌํ–ˆ๋Š”์ง€

5๋ฒˆ ๋ช…๋ น์—์„œ ๋ฌผ์˜ ์–‘์ด 2์ด์ƒ์ธ ๋ชจ๋“  ์นธ์— ๊ตฌ๋ฆ„์ด ์ƒ๊ธฐ๋Š”๋ฐ, ๊ตฌ๋ฆ„์ด ์‚ฌ๋ผ์กŒ๋˜ ์นธ์—์„œ๋Š” ๊ตฌ๋ฆ„์ด ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ์ตœ๊ทผ์— ์–ด๋””์„œ ๊ตฌ๋ฆ„์ด ์‚ฌ๋ผ์กŒ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋‚˜๋Š” visited[50][50] ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด์„œ ๊ตฌ๋ฆ„์ด ์žˆ์—ˆ๋˜ ์ž๋ฆฌ๋งŒ true๋กœ ํ‘œ์‹œํ•ด์ฃผ์—ˆ๋‹ค.

ํ‘œ์‹œํ•˜๋Š” ์‹œ์ ์€ ๊ตฌ๋ฆ„์„ ์ด๋™์‹œํ‚ฌ ๋•Œ ์ด๋™ ํ›„์˜ ์ž๋ฆฌ๋ฅผ ํ‘œ์‹œํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

  3. ๊ฐ ๊ฒฉ์ž๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๋ฌผ์˜ ์–‘์— ๋Œ€ํ•œ ์ •๋ณด

๊ฐ ๊ฒฉ์ž ์นธ๋งˆ๋‹ค ๋ฌผ์˜ ์–‘์„ ๊ณผ์ •์ด ์ง„ํ–‰๋จ์— ๋”ฐ๋ผ ๊ณ„์† ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„๋Œ€๋กœ A[r][c] ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ๊ฐ ์นธ๋งˆ๋‹ค ๋ฌผ์˜ ์–‘์„ ์ €์žฅํ–ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด์„œ ์ˆ˜์ •ํ•ด์•ผ ํ•  ์ •๋ณด๋Š” ํฌ๊ฒŒ ์œ„์˜ 3๊ฐ€์ง€๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • ๊ตฌ๋ฆ„์˜ ์ด๋™

์ƒ์–ด๊ฐ€ ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋ฉด ๊ตฌ๋ฆ„์€ d ๋ฐฉํ–ฅ์œผ๋กœ s๋งŒํผ ์ด๋™ํ•œ๋‹ค.

์ด๋•Œ ๊ฒฉ์žํŒ์€ 1๋ฒˆ ํ–‰,์—ด๊ณผ N๋ฒˆ ํ–‰,์—ด์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ๋•Œ๋ฌธ์— ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

๊ตฌ๋ฆ„์ด ์–ด๋–ค ๋ฐฉํ–ฅ์œผ๋กœ N์นธ ์ด๋™ํ•  ๊ฒฝ์šฐ ๊ฒฐ๊ตญ ์ œ์ž๋ฆฌ๋„ ๋Œ์•„์˜จ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— S๊ฐ€ N๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ

S %= N ์˜ ๊ณผ์ •์„ ํ†ตํ•ด ์ด๋™๊ฑฐ๋ฆฌ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 pair<int, int> now = Clouds[i];
 now.first = now.first + dy[direction] * speed + N;
 now.second = now.second + dx[direction] * speed + N;
 if (now.first > N)
 	now.first %= N;
 if (now.second > N)
 	now.second %= N;
 if (now.first == 0)
 	now.first += N;
 if (now.second == 0)
    now.second += N;โ€‹

๋‚˜๋Š” ๊ตฌ๋ฆ„์˜ ์ด๋™์„ ์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

๋งŒ์•ฝ ๋ฐฉํ–ฅ์ด - ๋ฐฉํ–ฅ์ธ ๊ฒฝ์šฐ, ๋ฐฉํ–ฅ * s ๋งŒํผ ์ด๋™ ํ•˜๋ฉด ์ขŒํ‘œ๊ฐ€ ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ + N ์„ ํ•ด์ฃผ๋ฉด ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ๊ฐ€ ์—†์–ด์ง„๋‹ค.

๋Œ€์‹  %N์„ ํ–ˆ์„ ๋•Œ 0์ด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ 0์€ 1์—์„œ -๋ฐฉํ–ฅ์œผ๋กœ 1์นธ ์ด๋™ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์‹ค N๋ฒˆ ์นธ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ–‰ ๋˜๋Š” ์—ด์ด 0์ธ ๊ฒฝ์šฐ์—๋Š” N์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#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;
int dx[] = { 0,-1,-1,0,1,1,1,0,-1 };
int dy[] = { 0,0,-1,-1,-1,0,1,1,1 };
int A[MAX_N][MAX_N];
bool visited[MAX_N][MAX_N];
vector<pair<intint>> Clouds;
 
void Move_Cloud(int direction, int speed);
bool is_ok(pair<intint> Position);
void Rain();
void Bug();
void Make_Cloud();
int get_water();
 
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> M;
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++)
            cin >> A[i][j];
    //์ดˆ๊ธฐ ๊ตฌ๋ฆ„ ์ƒ์„ฑ
    Clouds.push_back({ N,1 });
    Clouds.push_back({ N,2 });
    Clouds.push_back({ N - 1,1 });
    Clouds.push_back({ N - 1,2 });
    for (int i = 1; i <= M; i++) {
        int d, s;
        cin >> d >> s;
        Move_Cloud(d, s);
        Rain();
        Bug();
        Make_Cloud();
    }
    cout << get_water() << "\n";
    return 0;
}
 
void Move_Cloud(int direction, int speed) {
    speed %= N;
    memset(visited, falsesizeof(visited));
    for (int i = 0; i < Clouds.size(); i++) {
        pair<intint> now = Clouds[i];
        now.first = now.first + dy[direction] * speed + N;
        now.second = now.second + dx[direction] * speed + N;
        if (now.first > N)
            now.first %= N;
        if (now.second > N)
            now.second %= N;
        if (now.first == 0)
            now.first += N;
        if (now.second == 0)
            now.second += N;
        Clouds[i] = now;
        visited[now.first][now.second] = true;
    }
}
 
void Rain() {
    for (int i = 0; i < Clouds.size(); i++)
        A[Clouds[i].first][Clouds[i].second]++;
}
 
 
bool is_ok(pair<intint> Position) {
    if (Position.first < 1 || Position.first > N || Position.second < 1 || Position.second > N)
        return false;
    return true;
}
 
void Bug() {
    for (int i = 0; i < Clouds.size(); i++) {
        pair<intint> now = Clouds[i];
        int cnt = 0;
        for (int j = 2; j <= 8; j += 2) {
            pair<intint> next = { now.first + dy[j], now.second + dx[j] };
            if (is_ok(next) && A[next.first][next.second] >= 1)
                cnt++;
        }
        A[now.first][now.second] += cnt;
    }
}
 
 
void Make_Cloud() {
    Clouds.clear();
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            if (A[i][j] >= 2 && !visited[i][j]) {
                Clouds.push_back({ i,j });
                A[i][j] -= 2;
            }
        }
    }
    memset(visited, falsesizeof(visited));
}
 
int get_water() {
    int ret = 0;
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++)
            ret += A[i][j];
    return ret;
}
cs

๊ธฐ์กด์˜ ๋‚ด ์ฝ”๋“œ๊ฐ€ ๋ญ๊ฐ€ ์ž˜๋ชป๋๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ๊ตฌ๋ฆ„์„ ์ด๋™์‹œํ‚ค๋Š” ๊ณผ์ •์—์„œ ๋ญ”๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ๊ฐ™๋‹ค. ์˜ˆ์ œ๋ฌธ์ œ๋Š” ๋‹ค ์ž˜ ์ถœ๋ ฅ๋ผ์„œ ์–ด๋””์„œ ํ‹€๋ ธ๋Š”์ง€ ์ฐพ๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์› ๋‹ค.

 

728x90