๐ "๋ฏธ์ธ๋จผ์ง ์๋ !" ๋ฌธ์ ํ์ด ์ ๋ฆฌ!
์ด๋ฒ์ ์นด์นด์ค ์ฝํ ๋ฅผ ๋ณด๊ณ ๋นก๊ตฌํ ๋ฌธ์ ๋ฅผ ์กฐ๊ธ ํ์ด๋ด์ผ๊ฒ ๋ค ์ถ์ด์ ์ด ๋ฌธ์ ๋ฅผ ํ๊ฒ ๋์์ต๋๋ค.
solved.ac์์ class 4์ ์๋ ๋ฌธ์ ์ธ๋ฐ, ์์ ์ ํ ๋ฒ ํ๋ ค๋ค๊ฐ ๊ท์ฐฎ์์ ์ ํ์๋ ๊ฒ๋ ์๊ฐ๋์ ์ด๋ฒ ๊ธฐํ์ ์ ๋ฆฌํด๋ณด๋ ค ํฉ๋๋ค.
๋ฌธ์ ์ค๋ช
๋ฏธ์ธ๋จผ์ง๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ๊ตฌ์ฌ๊ณผ๋ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๋ฅผ ์ค์นํ๋ ค๊ณ ํ๋ค. ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ์ฑ๋ฅ์ ํ ์คํธํ๊ธฐ ์ํด ๊ตฌ์ฌ๊ณผ๋ ์ง์ ํฌ๊ธฐ๊ฐ R×C์ธ ๊ฒฉ์ํ์ผ๋ก ๋ํ๋๊ณ , 1×1 ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋ด๋ค. ๊ตฌ์ฌ๊ณผ๋ ๋ฐ์ด๋ ์ฝ๋ฉ ์ค๋ ฅ์ ์ด์ฉํด ๊ฐ ์นธ (r, c)์ ์๋ ๋ฏธ์ธ๋จผ์ง์ ์์ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ ์์คํ ์ ๊ฐ๋ฐํ๋ค. (r, c)๋ rํ c์ด์ ์๋ฏธํ๋ค.
๊ณต๊ธฐ์ฒญ์ ๊ธฐ๋ ํญ์ 1๋ฒ ์ด์ ์ค์น๋์ด ์๊ณ , ํฌ๊ธฐ๋ ๋ ํ์ ์ฐจ์งํ๋ค. ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๊ฐ ์ค์น๋์ด ์์ง ์์ ์นธ์๋ ๋ฏธ์ธ๋จผ์ง๊ฐ ์๊ณ , (r, c)์ ์๋ ๋ฏธ์ธ๋จผ์ง์ ์์ Ar,c์ด๋ค.
1์ด ๋์ ์๋ ์ ํ ์ผ์ด ์์๋๋ก ์ผ์ด๋๋ค.
- ๋ฏธ์ธ๋จผ์ง๊ฐ ํ์ฐ๋๋ค. ํ์ฐ์ ๋ฏธ์ธ๋จผ์ง๊ฐ ์๋ ๋ชจ๋ ์นธ์์ ๋์์ ์ผ์ด๋๋ค.
- (r, c)์ ์๋ ๋ฏธ์ธ๋จผ์ง๋ ์ธ์ ํ ๋ค ๋ฐฉํฅ์ผ๋ก ํ์ฐ๋๋ค.
- ์ธ์ ํ ๋ฐฉํฅ์ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๊ฐ ์๊ฑฐ๋, ์นธ์ด ์์ผ๋ฉด ๊ทธ ๋ฐฉํฅ์ผ๋ก๋ ํ์ฐ์ด ์ผ์ด๋์ง ์๋๋ค.
- ํ์ฐ๋๋ ์์ Ar,c/5์ด๊ณ ์์์ ์ ๋ฒ๋ฆฐ๋ค.
- (r, c)์ ๋จ์ ๋ฏธ์ธ๋จผ์ง์ ์์ Ar,c - (Ar,c/5)×(ํ์ฐ๋ ๋ฐฉํฅ์ ๊ฐ์) ์ด๋ค.
- ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๊ฐ ์๋ํ๋ค.
- ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์์๋ ๋ฐ๋์ด ๋์จ๋ค.
- ์์ชฝ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ๋ฐ๋์ ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ์ํํ๊ณ , ์๋์ชฝ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ๋ฐ๋์ ์๊ณ๋ฐฉํฅ์ผ๋ก ์ํํ๋ค.
- ๋ฐ๋์ด ๋ถ๋ฉด ๋ฏธ์ธ๋จผ์ง๊ฐ ๋ฐ๋์ ๋ฐฉํฅ๋๋ก ๋ชจ๋ ํ ์นธ์ฉ ์ด๋ํ๋ค.
- ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์์ ๋ถ๋ ๋ฐ๋์ ๋ฏธ์ธ๋จผ์ง๊ฐ ์๋ ๋ฐ๋์ด๊ณ , ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๋ก ๋ค์ด๊ฐ ๋ฏธ์ธ๋จผ์ง๋ ๋ชจ๋ ์ ํ๋๋ค.
๋ค์์ ํ์ฐ์ ์์์ด๋ค.
์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ์นธ์ด ์๊ธฐ ๋๋ฌธ์, ๋ ๋ฐฉํฅ์ผ๋ก๋ง ํ์ฐ์ด ์ผ์ด๋ฌ๋ค.
์ธ์ ํ ๋ค ๋ฐฉํฅ์ผ๋ก ๋ชจ๋ ํ์ฐ์ด ์ผ์ด๋๋ค.
๊ณต๊ธฐ์ฒญ์ ๊ธฐ๊ฐ ์๋ ์นธ์ผ๋ก๋ ํ์ฐ์ด ์ผ์ด๋์ง ์๋๋ค.
๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ๋ฐ๋์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์ํํ๋ค.
๋ฐฉ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, T์ด๊ฐ ์ง๋ ํ ๊ตฌ์ฌ๊ณผ์ ๋ฐฉ์ ๋จ์์๋ ๋ฏธ์ธ๋จผ์ง์ ์์ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ R, C, T (6 ≤ R, C ≤ 50, 1 ≤ T ≤ 1,000)๊ฐ ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ R๊ฐ์ ์ค์ Ar, c (-1 ≤ Ar,c ≤ 1,000)๊ฐ ์ฃผ์ด์ง๋ค. ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๊ฐ ์ค์น๋ ๊ณณ์ Ar, c๊ฐ -1์ด๊ณ , ๋๋จธ์ง ๊ฐ์ ๋ฏธ์ธ๋จผ์ง์ ์์ด๋ค. -1์ 2๋ฒ ์์๋๋ก ๋ถ์ด์ ธ ์๊ณ , ๊ฐ์ฅ ์ ํ, ์๋ซ ํ๊ณผ ๋ ์นธ ์ด์ ๋จ์ด์ ธ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ T์ด๊ฐ ์ง๋ ํ ๊ตฌ์ฌ๊ณผ ๋ฐฉ์ ๋จ์์๋ ๋ฏธ์ธ๋จผ์ง์ ์์ ์ถ๋ ฅํ๋ค.
๐ ํ์ด ์ค๋ช
์ฌ์ค ํจ์จ์ ์ผ๋ก ์ง๋ ค๊ณ ํ๊ธฐ๋ณด๋ค๋ ๊ท์ฐฎ์์ ํ๋ฑ ํ์ด๋ณด์๋ ๋๋์ผ๋ก ํ์๊ธฐ ๋๋ฌธ์, ๊ฐ์ ํ ๋งํ ๋ถ๋ถ์ด ์์ ๊ฒ ๊ฐ์ง๋ง ๊ท์ฐฎ๊ธฐ ๋๋ฌธ์ ๋ค์์ ์ ์ฌํ ๋ฌธ์ ๋ฅผ ํ์ดํ ๋ ๋ ์ ์ง ๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ด์จ๋ ์ด๋ฒ ๋ฌธ์ ์ค๋ช ์ ์ด์ด๊ฐ์๋ฉด, ์ด๋ฒ ๋ฌธ์ ๋ ๋นก๊ตฌํ ์ ํ์ ๋ฌธ์ ๋ก ๋ฌธ์ ์์ ์๊ตฌํ๋ ๊ธด ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ์ ๊ทธ๋๋ก๋ง ๊ตฌํํ๋ ๋ง์ถ ์ ์์์ต๋๋ค. (์กฐ๊ธ ์ค๋ ๊ฑธ๋ฆฌ๊ธด ํ์ต๋๋ค..)
์ ๋ ํฌ๊ฒ ๋ค์๊ณผ ๊ฐ์ด ๋๋ ์ ๊ตฌํํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
- ์ด๊ธฐํ ๋ถ๋ถ (input)
- ๋ฏธ์ธ๋จผ์ง์ ํ์ฐ (spreadDust)
- ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ๊ฐ๋ (airfresherOn)
- ๋ค์ํ ๋ถ๊ฐ์ ๊ธฐ๋ฅ์ ์ํด ๊ตฌํํด์ผ ํ๋ ํจ์๋ค (inRange, printStatus, totalDustAmount)
์ ๋ชฉ๋ก์์ ์ค์ํ๋ฉด์, ์ด๋ ค์ด ๋ถ๋ถ์ด ํฌ๊ฒ ๋ ๊ฐ์ง์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋จผ์ ๋ฏธ์ธ๋จผ์ง์ ํ์ฐ ๋ค์์ผ๋ก๋ ๋น์ฐํ๊ฒ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ๊ฐ๋ ๋ถ๋ถ์ด์ฃ
๋ฏธ์ธ๋จผ์ง๋ ๋์์ ํ์ฐ์ด ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์, ๋จ์ํ๊ฒ ์ ์ฒด ์ง ๋ฐฐ์ด์ ์นธ์ ๋๋ฉด์ ๋ฏธ์ธ๋จผ์ง๊ฐ ์์ผ๋ ๋ฐ๋ก ํ์ฐ์ํค์!๋ผ๊ณ ๊ตฌํํ ์ ์์ต๋๋ค. (์ด๋ ๊ฒ ๋๋ฉด ๋ฏธ์ธ๋จผ์ง ํ์ฐ์ผ๋ก ์๋ก ๋ฏธ์ธ๋จผ์ง๊ฐ ์๋ ์นธ์ด ์์ฑ๋๊ณ ๊ทธ์ ๋ฐ๋ผ์ ๊ณ์ ํ์ฐ์ด ๋ฌดํํ ์ด์ด์ง๊ธฐ ๋๋ฌธ์ด์ฃ )
๊ทธ๋์ ์ ๋ ํ์ฐ ์ด์ ์ ํ์ฌ ์ํ์์ ๋ฏธ์ธ๋จผ์ง๊ฐ ์๋ ์นธ์ ๋จผ์ queue ์๋ฃ ๊ตฌ์กฐ์ ๋ฃ์ ํ์ queue์์ ํ๋์ฉ ๋นผ๋ฉด์ ํ์ฐ ๊ณผ์ ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์ต๋๋ค. (์ด queue์๋ ํ์ฐ๋๋ ๋ฏธ์ธ๋จผ์ง์ ์๋ ๊ฐ์ด ๋ฃ์ด์ค์ผ ํฉ๋๋ค. ์ด๋ ํ์ฐ ๊ณผ์ ์์ ๋ฏธ์ธ๋จผ์ง์ ์์ด ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ๋๋ค! ๐)
์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋ฏธ์ธ๋จผ์ง ํ์ฐ ๋ถ๋ถ์ ๊ตฌํํ๊ณ , ๊ณต๊ธฐ ์ฒญ์ ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ ๋ถ๋ถ์ ๊ทธ๋ฅ ์ํค๋ ๋๋ก ๊ตฌํํ๋ ์๋์ ์ผ๋ก ๊ฐ๋จํ๊ฒ(?) ๊ตฌํํ ์ ์์์ต๋๋ค.
๐ ์ ์ถ ์ฝ๋ ์ ์ฒด
/*
Date: 2022/08/23
Brief:
Reference:
*/
#include <iostream>
#include <queue>
#define MAX 51
using namespace std;
int arr[MAX][MAX];
int r, c, t;
void input() {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cin >> arr[i][j];
}
}
}
// (x, y)๊ฐ ๋งต ๋ด๋ถ์ธ์ง ํ์ธํ๋ ํจ์์ด๋ค.
bool inRange(int x, int y) {
return (0 <= x && x < r && 0 <= y && y < c);
}
void spreadDust() {
int dx[] = { -1, 1, 0, 0 };
int dy[] = { 0, 0, -1, 1 };
queue<pair<int, pair<int, int>>> q;
// ๋จผ์ ํ์ฌ ์์ ๊ธฐ์ค์ผ๋ก ๋ชจ๋ ๋ฏธ์ธ ๋จผ์ง์ ์์น์ ํผ์ง ์์ ํ์ ๋ด๋๋ค.
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
// ๊ณต๊ธฐ์ฒญ์ ๊ธฐ๋ ๊ฑด๋ ๋๋ค.
if (arr[i][j] == -1)
continue;
if (arr[i][j] != 0) {
// ํผ์ง ๋ฏธ์ธ๋จผ์ง์ ์๊ณผ ์์น๋ฅผ ํ์ ๋ด๋๋ค.
q.push({ arr[i][j] / 5, {i, j} });
}
}
}
// queue์ ๋ด๊ธด ๋ฏธ์ธ๋จผ์ง๋ฅผ ๊ฐ๋ฅํ ๋ฐฉํฅ์ผ๋ก ํ ๋ฒ์ ํผ๋จ๋ฆฐ๋ค.
while (!q.empty()) {
int x = q.front().second.first;
int y = q.front().second.second;
int spreadDustAmount = q.front().first;
q.pop();
//cout << x << " " << y << " " << spreadDustAmount << endl;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (!inRange(nx, ny) || arr[nx][ny] == -1)
continue;
// ํผ์ง ๋งํผ ํด๋น ์นธ์ ๋ฏธ์ธ๋จผ์ง๊ฐ ์ฆํ๊ณ ์๋ ์นธ์๋ ์ค์ด๋ ๋ค.
arr[nx][ny] += spreadDustAmount;
arr[x][y] -= spreadDustAmount;
}
}
}
void airfresherOn() {
int first = 0, second = 1;
// ์ฐ, ์, ์ข, ํ ์์ผ๋ก ๊ณต๊ธฐ๊ฐ ์ํํ๋ค.
int dx1[] = { 0, -1, 0, 1 };
int dy1[] = { 1, 0, -1, 0 };
// ๊ณต๊ธฐ ์ฒญ์ ๊ธฐ์ ์์น๋ฅผ ์ฐพ๋๋ค.
for (int i = 0; i < r; i++) {
if (arr[i][0] == -1) {
first = i, second = i + 1;
break;
}
}
int x = first, y = 0;
int prev = 0;
int idx = 0;
// ๊ณต๊ธฐ ์ฒญ์ ๊ธฐ๋ก ๋์์ฌ๋๊น์ง ํ๋๋ค.
while (1) {
int nx = x + dx1[idx], ny = y + dy1[idx];
// ๋งต์ ๋์ ๋์ด๊ฐ๋ฉด ํ์ ๋ฐฉํฅ์ ๋ฐ๊พผ๋ค.
if (!inRange(nx, ny)) {
idx++;
continue;
}
// ๋ค์ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ๋๋ฌํ๋ฉด ๊ณต๊ธฐ ์ํ์ ๋ฉ์ถ๋ค.
if (nx == first && ny == 0)
break;
// ํด๋น ์นธ์ ๊ณต๊ธฐ๋ฅผ ์ด๋์ํค๊ณ ์นธ์ ์์น๋ ์ด๋ํ๋ค.
int cur = arr[nx][ny];
arr[nx][ny] = prev;
prev = cur;
x = nx, y = ny;
}
// ์ฐ, ํ, ์ข, ์ ์์ผ๋ก ๊ณต๊ธฐ๊ฐ ์ํํ๋ค.
int dx2[] = { 0, 1, 0, -1 };
int dy2[] = { 1, 0, -1, 0 };
x = second, y = 0;
prev = 0;
idx = 0;
// ๊ณต๊ธฐ ์ฒญ์ ๊ธฐ๋ก ๋์์ฌ๋๊น์ง ํ๋๋ค.
while (1) {
int nx = x + dx2[idx], ny = y + dy2[idx];
// ๋งต์ ๋์ ๋์ด๊ฐ๋ฉด ํ์ ๋ฐฉํฅ์ ๋ฐ๊พผ๋ค.
if (!inRange(nx, ny)) {
idx++;
continue;
}
// ๋ค์ ๊ณต๊ธฐ์ฒญ์ ๊ธฐ์ ๋๋ฌํ๋ฉด ๊ณต๊ธฐ ์ํ์ ๋ฉ์ถ๋ค.
if (nx == second && ny == 0)
break;
// ํด๋น ์นธ์ ๊ณต๊ธฐ๋ฅผ ์ด๋์ํค๊ณ ์นธ์ ์์น๋ ์ด๋ํ๋ค.
int cur = arr[nx][ny];
arr[nx][ny] = prev;
prev = cur;
x = nx, y = ny;
}
return;
}
int totalDustAmount() {
int res = 0;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (arr[i][j] == -1)
continue;
res += arr[i][j];
}
}
return res;
}
void printStatus() {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cout << arr[i][j] << " ";
}
cout << "\n";
}
return;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> r >> c >> t;
input();
while (t--) {
spreadDust();
airfresherOn();
}
//printStatus();
cout << totalDustAmount();
return 0;
}
๋๊ธ