hades

[Baekjoon] 17144๋ฒˆ: ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•! ๋ณธ๋ฌธ

๐Ÿ‘Š PS/Algorithm

[Baekjoon] 17144๋ฒˆ: ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•!

hades1 2024. 9. 5. 22:21

๐Ÿฅ… ๋ฌธ์ œ

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

 

๐Ÿ” ์„ค๊ณ„

ํ™•์‚ฐ, ๋ฐ˜์‹œ๊ณ„ ์ˆœํ™˜, ์‹œ๊ณ„ ์ˆœํ™˜์„ ๊ฐ๊ฐ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

 

๋จผ์ €, ํ™•์‚ฐ์„ ์„ค๊ณ„ํ•ด๋ณด์•˜๋‹ค. ํ™•์‚ฐ์€ ๋™์‹œ์— ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด ๋ฒกํ„ฐ์—์„œ ์ง„ํ–‰ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, 0ํ–‰ 0์—ด์—์„œ ํ™•์‚ฐ์ด ์ผ์–ด๋‚ฌ๊ณ , ํ™•์‚ฐ๋œ ์–‘์„ 0ํ–‰ 1์—ด์— ์ถ”๊ฐ€ํ•˜๋ฉด, 0ํ–‰ 1์—ด์—์„œ ํ™•์‚ฐ์ด ์ผ์–ด๋‚  ๋•Œ, ๋”ํ•ด์ง„ ์–‘์„ ๊ณ ๋ คํ•œ ๋ฏธ์„ธ๋จผ์ง€์˜ ์–‘์œผ๋กœ ํ™•์‚ฐ์ด ์ผ์–ด๋‚œ๋‹ค. ๋”ฐ๋ผ์„œ, ํ™•์‚ฐ๊ณผ ๊ด€๋ จ๋œ ์—ฐ์‚ฐ์€ before_spread์—์„œ ํ•˜๊ณ , ํ™•์‚ฐ๋˜๋Š” ์–‘๊ณผ ๋‚จ์€ ์–‘์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด after_spread๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

 

ํ™•์‚ฐ๋˜๋Š” ์–‘์˜ ์ดํ•ฉ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ํ™•์‚ฐ๋˜๋Š” ์œ„์น˜์—์„œ ๋”ํ•˜๋Š” ๊ฒƒ์€ ์ž˜ํ–ˆ์œผ๋‚˜, ๋‚จ์€ ์–‘์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ =์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. =์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ, ํ™•์‚ฐ๋˜๋Š” ์–‘์ด ์ €์žฅ๋˜์—ˆ์„ ๋•Œ, ๊ทธ ๊ฐ’์ด ๋ฌด์‹œ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ , ํ™•์‚ฐ๋˜๋Š” ์–‘์„ ์ €์žฅํ•  ๋•Œ๋„ +๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

๋ฐ˜์‹œ๊ณ„, ์‹œ๊ณ„ ์ˆœํ™˜์€ ํ™”์‚ดํ‘œ์˜ ๋๋ถ€ํ„ฐ ์‹œ์ž‘์ ๊นŒ์ง€ ์ฒœ์ฒœํžˆ ํ•˜๋ฉด, ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ‘Š ํ’€์ด

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int r, c, t, spread_amount, result = 0;
int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };
vector<vector<int>> before_spread(50, vector<int>(50));
vector<vector<int>> after_spread(50, vector<int>(50));
vector<int> vacuum_row;

void spread() {
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			after_spread[i][j] += before_spread[i][j];
			if (before_spread[i][j] == -1) {
				continue;
			}
			spread_amount = before_spread[i][j] / 5;
			for (int k = 0; k < 4; k++) {
				int new_x = i + dx[k];
				int new_y = j + dy[k];
				if ((new_x >= 0 && new_x < r && new_y >= 0 && new_y < c) && before_spread[new_x][new_y] != -1) {
					after_spread[i][j] -= spread_amount;
					after_spread[new_x][new_y] += spread_amount;
				}
			}
			
		}
	}
	before_spread = after_spread;
	after_spread = vector<vector<int>>(50, vector<int>(50));
}

void clockwise() {
	for (int i = vacuum_row[1] + 1; i < r - 1; i++) {
		before_spread[i][0] = before_spread[i + 1][0];
	}
	for (int i = 0; i < c - 1; i++) {
		before_spread[r - 1][i] = before_spread[r - 1][i + 1];
	}
	for (int i = r - 1; i > vacuum_row[1]; i--) {
		before_spread[i][c - 1] = before_spread[i - 1][c - 1];
	}
	for (int i = c - 1; i > 1; i--) {
		before_spread[vacuum_row[1]][i] = before_spread[vacuum_row[1]][i - 1];
	}

	before_spread[vacuum_row[1]][1] = 0;
}

void anti_clockwise() {
	for (int i = vacuum_row[0] - 1; i > 0; i--) {
		before_spread[i][0] = before_spread[i - 1][0];
	}
	for (int i = 0; i < c - 1; i++) {
		before_spread[0][i] = before_spread[0][i + 1];
	}
	for (int i = 0; i < vacuum_row[0]; i++) {
		before_spread[i][c - 1] = before_spread[i + 1][c - 1];
	}
	for (int i = c - 1; i > 1; i--) {
		before_spread[vacuum_row[0]][i] = before_spread[vacuum_row[0]][i - 1];
	}
	before_spread[vacuum_row[0]][1] = 0;
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);	
	cin >> r >> c >> t;
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			cin >> before_spread[i][j];
			if (before_spread[i][j] == -1) {
				vacuum_row.push_back(i);
			}
		}
	}

	for (int i = 0; i < t; i++) {
		spread();
		anti_clockwise();
		clockwise();
	}
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			result += before_spread[i][j];
		}
	}
	result += 2;
	cout << result << "\n";

	return 0;
}