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

[BOJ] 16235 : ๋‚˜๋ฌด ์žฌํ…Œํฌ

by Jaeguk 2022. 5. 11.
๋ฌธ์ œ ๋งํฌ

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

 

16235๋ฒˆ: ๋‚˜๋ฌด ์žฌํ…Œํฌ

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

www.acmicpc.net

๋‹จ์ˆœํ•œ ๊ตฌํ˜„ ๋ฌธ์ œ.

ํ’€์ด

์ดˆ๊ธฐ ์–‘๋ถ„์€ ๋ชจ๋“  ์นธ์ด 5๋กœ ๋™์ผํ•˜๋‹ค๋Š” ๋ฌธ์ œ ์กฐ๊ฑด์„ ์•ˆ์ฝ์–ด์„œ ๊ณ„์† ๋ชปํ’€๊ณ  ์žˆ์—ˆ๋‹ค. ํ•ญ์ƒ ๋А๋ผ๋Š” ๊ฑฐ์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ์ž˜ ์ฝ์–ด์•ผํ•œ๋‹ค *^^*

๊ฐ ์นธ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋‚˜๋ฌด๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ๋ฒกํ„ฐ๋ฅผ 2์ฐจ์›์œผ๋กœ ์„ ์–ธํ•ด์„œ ๊ฐ ์ขŒํ‘œ๋งˆ๋‹ค ๋‚˜๋ฌด์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ณ„์ ˆ๋งˆ๋‹ค ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ณ„์ ˆ๋งˆ๋‹ค ์ž‘์—…์„ ํ•ด์ฃผ์—ˆ๋‹ค.

1. ๋ด„ & ์—ฌ๋ฆ„

๋ด„์—๋Š” ๋‚˜๋ฌด๊ฐ€ ์ž์‹ ์˜ ๋‚˜์ด๋งŒํผ ์–‘๋ถ„์„ ๋จน๊ณ  ๋‚˜์ด๊ฐ€ 1์ฆ๊ฐ€ํ•œ๋‹ค.

"๋งŒ์•ฝ ๋‚˜๋ฌด๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ธ ๊ฒฝ์šฐ ์–ด๋ฆฐ ๋‚˜๋ฌด๋ถ€ํ„ฐ ์–‘๋ถ„์„ ์„ญ์ทจํ•œ๋‹ค." ๋ผ๋Š” ์กฐ๊ฑด์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ด„์ด ์‹œ์ž‘๋˜๊ธฐ์ „ ๋ชจ๋“  ๋‚˜๋ฌด๋ฒกํ„ฐ๋ฅผ ๋‚˜์ด์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์–‘๋ถ„์ด ๋ถ€์กฑํ•ด์„œ ๋จน์ง€๋ชปํ•œ ๋‚˜๋ฌด๋Š” ์ฆ‰์‹œ ์ฃฝ๊ณ  ์–‘๋ถ„์ด ๋˜์–ด์•ผํ•˜๊ธฐ๋•Œ๋ฌธ์—

์ž„์˜์˜ (i, j) ์ขŒํ‘œ์˜ ๋‚˜๋ฌด๋ฅผ ๊ธฐ์ค€์œผ๋กœ, ๋งŒ์•ฝ์— k๋ฒˆ์งธ ๋‚˜๋ฌด๋ถ€ํ„ฐ ์–‘๋ถ„์„ ๋ชปํ•œ๋‹ค๊ณ  ํ•˜๋ฉด k๋ฒˆ์งธ ๋‚˜๋ฌด๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ๋‚˜๋ฌด๊นŒ์ง€๋Š” ๋ชจ๋‘ ์ฃฝ๊ณ  ์–‘๋ถ„์ด ๋˜์–ด์•ผํ•œ๋‹ค. ์ฃฝ๋Š” ๋‚˜๋ฌด๋“ค์˜ ๋‚˜์ด / 2 ์˜ ์ดํ•ฉ์„ ์ €์žฅํ•ด๋‘๊ณ  (i, j) ์ขŒํ‘œ์˜ ์–‘๋ถ„์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฃฝ์€ ๋‚˜๋ฌด๋“ค์€ ๋ฒกํ„ฐ์—์„œ ์‚ญ์ œํ•œ๋‹ค.

์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ด„๊ณผ ์—ฌ๋ฆ„์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

void Spring_Summer() {
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			if (tree[i][j].empty())
				continue;
			int nutrition = 0;
			int k;
			vector<int> alive;
			for (k = 0; k < tree[i][j].size(); k++) {
				if (B[i][j] >= tree[i][j][k]) { //์–‘๋ถ„์ด ๋‚จ์•„์žˆ์œผ๋ฉด
					B[i][j] -= tree[i][j][k];
					tree[i][j][k]++; //๋‚˜์ด 1์ฆ๊ฐ€
					alive.push_back(tree[i][j][k]);
				}
				else break;
			}
			for (int t = k; t < tree[i][j].size(); t++)
				nutrition += (tree[i][j][t] / 2);
			tree[i][j].clear();
			tree[i][j] = alive;
			B[i][j] += nutrition;
		}
	}
}โ€‹

 

์—ฌ๊ธฐ์„œ B ๋ฐฐ์—ด์€ ๊ฐ ์ขŒํ‘œ๋งˆ๋‹ค ๋‚จ์•„์žˆ๋Š” ์–‘๋ถ„์˜ ์–‘์ด๋‹ค.

2. ๊ฐ€์„

๊ฐ€์„์—๋Š” ๋‚˜์ด๊ฐ€ 5์˜ ๋ฐฐ์ˆ˜์ธ ๋‚˜๋ฌด๋“ค์ด ๋ฒˆ์‹์„ ํ•˜๋Š” ์‹œ๊ธฐ์ด๋‹ค.

๊ฐ ์ขŒํ‘œ๋ฅผ ๋Œ๋ฉด์„œ ๋งŒ์•ฝ ๋‚˜์ด๊ฐ€ 5์ธ ๋‚˜๋ฌด๊ฐ€ ์žˆ๋‹ค๋ฉด ์ธ์ ‘ํ•œ ์ง€์—ญ์— ๋‚˜์ด๊ฐ€ 1์ธ ๋‚˜๋ฌด๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ธ์ ‘ํ•œ ์ง€์—ญ์˜ ์ขŒํ‘œ๋Š” dx[], dy[] ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ์ธ์ ‘ํ•œ ์ง€์—ญ์˜ ์ขŒํ‘œ๋ฅผ ์ฐพ์•„์คฌ๋‹ค.

void Fall() {
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			if (tree[i][j].empty())
				continue;
			for (int k = 0; k < tree[i][j].size(); k++) {
				if (tree[i][j][k] % 5 == 0) { //๋ฒˆ์‹ ๊ฐ€๋Šฅ
					for (int p = 0; p < 8; p++) {
						pair<int, int> adjacent = { i + dy[p], j + dx[p] };
						if (is_ok(adjacent.first, adjacent.second))
							tree[adjacent.first][adjacent.second].push_back(1);
					}
				}
			}
		}
	}
}

3. ๊ฒจ์šธ

๊ฒจ์šธ์—๋Š” ์ดˆ๊ธฐ์— ์ž…๋ ฅ๋ฐ›์€ A๋ฐฐ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋“  ์ขŒํ‘œ์— A๋ฐฐ์—ด์— ์ €์žฅ๋œ ๊ฐ’๋งŒํผ ์–‘๋ถ„์„ ์ถฉ์ „ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

void Winter() {
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			B[i][j] += A[i][j];
		}
	}
}

 

์ด ํ•จ์ˆ˜๋“ค์„ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

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
#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 <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 = 10 + 5;
int A[MAX_N][MAX_N];
int B[MAX_N][MAX_N];
int dx[] = { 0,1,0,-1,1,-1,1,-1 };
int dy[] = { 1,0,-1,0,1,1,-1,-1 };
vector<int> tree[MAX_N][MAX_N];
int N, M, K;
 
bool is_ok(int y, int x) {
    if (x <= 0 || x > N || y <= 0 || y > N)
        return false;
    return true;
}
 
void Spring_Summer() {
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            if (tree[i][j].empty())
                continue;
            int nutrition = 0;
            int k;
            vector<int> alive;
            for (k = 0; k < tree[i][j].size(); k++) {
                if (B[i][j] >= tree[i][j][k]) { //์–‘๋ถ„์ด ๋‚จ์•„์žˆ์œผ๋ฉด
                    B[i][j] -= tree[i][j][k];
                    tree[i][j][k]++//๋‚˜์ด 1์ฆ๊ฐ€
                    alive.push_back(tree[i][j][k]);
                }
                else break;
            }
            for (int t = k; t < tree[i][j].size(); t++)
                nutrition += (tree[i][j][t] / 2);
            tree[i][j].clear();
            tree[i][j] = alive;
            B[i][j] += nutrition;
        }
    }
}
 
void Fall() {
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            if (tree[i][j].empty())
                continue;
            for (int k = 0; k < tree[i][j].size(); k++) {
                if (tree[i][j][k] % 5 == 0) { //๋ฒˆ์‹ ๊ฐ€๋Šฅ
                    for (int p = 0; p < 8; p++) {
                        pair<intint> adjacent = { i + dy[p], j + dx[p] };
                        if (is_ok(adjacent.first, adjacent.second))
                            tree[adjacent.first][adjacent.second].push_back(1);
                    }
                }
            }
        }
    }
}
 
void Winter() {
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            B[i][j] += A[i][j];
        }
    }
}
 
void sort_tree() {
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++)
            sort(tree[i][j].begin(), tree[i][j].end());
}
 
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> M >> K;
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            cin >> A[i][j];
            B[i][j] = 5;
        }
    }
    for (int i = 0; i < M; i++) {
        int y, x, z;
        cin >> y >> x >> z;
        tree[y][x].push_back(z);
    }
 
    while (K--) {
        sort_tree();
        Spring_Summer();
        Fall();
        Winter();
    }
    int ans = 0;
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            ans += tree[i][j].size();
        }
    }
    cout << ans << "\n";
    return 0;
}
cs

728x90