hades

[Baekjoon] 16236๋ฒˆ: ์•„๊ธฐ ์ƒ์–ด ๋ณธ๋ฌธ

๐Ÿ‘Š PS/Algorithm

[Baekjoon] 16236๋ฒˆ: ์•„๊ธฐ ์ƒ์–ด

hades1 2024. 9. 7. 22:29

๐Ÿฅ… ๋ฌธ์ œ

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

 

๐Ÿ” ์„ค๊ณ„

์ดˆ๊ธฐ ์„ค๊ณ„์—์„œ๋Š” ์ดˆ๋ฅผ ๋Š˜๋ฆฌ๋ฉด์„œ, ๊ฑฐ๋ฆฌ๊ฐ€ ๋™์ผํ•  ๋•Œ๋Š” ์œ„, ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ, ์•„๋ž˜ ์ˆœ์œผ๋กœ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์œผ๋ฏ€๋กœ, ํƒ์ƒ‰ ์ˆœ์„œ๋„ ์œ„, ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ, ์•„๋ž˜ ์ˆœ์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.

 

๋จน์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด, ๋ฐ”๋กœ ๋จน๊ณ , ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

๋จน์„ ์ˆ˜ ์—†์œผ๋ฉด, ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ•˜๊ณ , ํ์— ๋‹ด๋Š”๋‹ค.

 

๋ฐ˜ํ™˜๋œ ๊ฑฐ๋ฆฌ๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด, ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ, ์ตœ์ข… ๊ฒฐ๊ณผ์— ๋”ํ•œ๋‹ค.

๋ฐ˜ํ™˜๋œ ๊ฑฐ๋ฆฌ๊ฐ€ 0์ด๋ฉด ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋” ์ด์ƒ ์—†๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ์ข…๋ฃŒํ•œ๋‹ค.

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

int n, baby_shark_size = 2, eat_count = 0, baby_shark_x, baby_shark_y, plus_dist, result = 0;
int dx[] = { -1,0,0,1 };
int dy[] = { 0,-1,1,0 };

vector<vector<int>> space(20, vector<int>(20));
vector<vector<int>> dist(20, vector<int>(20, 1e9 + 7));

void grow() {
	if (eat_count == baby_shark_size) {
		baby_shark_size += 1;
		eat_count = 0;
	}
}

int bfs() {
	int cur_dist = 0;
	queue<pair<int, int>> q;
	q.push({ baby_shark_x, baby_shark_y });
	dist[baby_shark_x][baby_shark_y] = 0;
	
	while (!q.empty()) {
		int size = q.size();
		cur_dist += 1;
		for (int i = 0; i < size; i++) {
			int cur_x = q.front().first;
			int cur_y = q.front().second;
			q.pop();
			for (int j = 0; j < 4; j++) {
				int new_x = cur_x + dx[j];
				int new_y = cur_y + dy[j];
				if (new_x >= 0 && new_x < n && new_y >= 0 && new_y < n) {
					if (dist[new_x][new_y] < cur_dist) {
						continue;
					}
					if ((space[new_x][new_y] == 0) || (space[new_x][new_y] == baby_shark_size)) {
						dist[new_x][new_y] = cur_dist;
						q.push({ new_x, new_y });
					}
					else if (space[new_x][new_y] < baby_shark_size) {
						eat_count += 1;
						baby_shark_x = new_x;
						baby_shark_y = new_y;
						space[new_x][new_y] = 0;
						grow();
						return cur_dist;
					}
				}
			}
		}
	}
	return 0;
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);	

	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> space[i][j];
			if (space[i][j] == 9) {
				baby_shark_x = i;
				baby_shark_y = j;
				space[i][j] = 0;
			}
		}
	}
	
	while (true) {
		dist = vector<vector<int>>(20, vector<int>(20, 1e9 + 7));
		plus_dist = bfs();

		if (plus_dist == 0) {
			break;
		}
		else {
			result += plus_dist;
		}
	}

	cout << result << "\n";

	return 0;
}

 

์ตœ์ข…์ ์œผ๋กœ ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์˜ˆ์ œ ์ž…๋ ฅ 4๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

 

์ด์œ ๋ฅผ ์•Œ์•„๋ณด๋‹ˆ 


5 4 0 0 3 4
4 3 0 3 4 5
3 2 0 5 6 6
2 0 0 3 4 5
3 2 0 6 5 4
6 6 6 6 6 6

5 4 0 0 3 4
0 0 3 4 5
3 2 0 5 6 6
2 0 0 3 4 5
3 2 0 6 5 4
6 6 6 6 6 6

 

์‹œ์ž‘ ์œ„์น˜๋Š” ๋…ธ๋ž€์ƒ‰์ด๊ณ , ํŒŒ๋ž€์ƒ‰์ด 0์ด ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ, ๋นจ๊ฐ„์ƒ‰์ด 0์ด ๋˜์—ˆ๋‹ค. ๋นจ๊ฐ„์ƒ‰๊ณผ ํŒŒ๋ž€์ƒ‰๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋Š” ๊ฐ™์ง€๋งŒ, ์œ„, ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ, ์•„๋ž˜ ์ˆœ์œผ๋กœ ํƒ์ƒ‰์„ ๋ฐ˜๋ณตํ•˜๋ฏ€๋กœ, ์™ผ์ชฝ+์•„๋ž˜๊ฐ€ ์˜ค๋ฅธ์ชฝ+์˜ค๋ฅธ์ชฝ๋ณด๋‹ค ๋จผ์ € ํƒ์ƒ‰๋˜๊ฒŒ ๋œ๋‹ค.


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

 

์ฃผ์˜ํ•ด์•ผ ํ•  ๊ฒƒ์€ ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์ด๋ฅผ ๋จน์œผ๋ฉด, ๊ทธ ์œ„์น˜๋Š” 0์œผ๋กœ ๊ฐฑ์‹ ํ•˜๋ฏ€๋กœ, ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ–๋Š” ๋จน์ด์˜ ์œ„์น˜๋ฅผ ์ฐพ์„ ๋•Œ, ๊ทธ ์นธ์— ์žˆ๋Š” ์ˆ˜๊ฐ€ 0 ๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋ง์ž.

 

๐Ÿ‘Š ํ’€์ด

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

int n, baby_shark_size = 2, eat_count = 0, baby_shark_x, baby_shark_y, result = 0, min_value, temp_x, temp_y;
int dx[] = { -1,0,0,1 };
int dy[] = { 0,-1,1,0 };

vector<vector<int>> space(20, vector<int>(20));
vector<vector<int>> dist(20, vector<int>(20, 1e9 + 7));

void grow() {
	if (eat_count == baby_shark_size) {
		baby_shark_size += 1;
		eat_count = 0;
	}
}

void bfs() {
	int cur_dist = 0;
	queue<pair<int, int>> q;
	q.push({ baby_shark_x, baby_shark_y });
	dist[baby_shark_x][baby_shark_y] = 0;
	
	while (!q.empty()) {
		int size = q.size();
		cur_dist += 1;
		for (int i = 0; i < size; i++) {
			int cur_x = q.front().first;
			int cur_y = q.front().second;
			q.pop();
			for (int j = 0; j < 4; j++) {
				int new_x = cur_x + dx[j];
				int new_y = cur_y + dy[j];
				if (new_x >= 0 && new_x < n && new_y >= 0 && new_y < n) {
					if (dist[new_x][new_y] > cur_dist) {
						if (space[new_x][new_y] <= baby_shark_size) {
							dist[new_x][new_y] = cur_dist;
							q.push({ new_x, new_y });
						}
					}
					
				}
			}
		}
	}
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);	

	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> space[i][j];
			if (space[i][j] == 9) {
				baby_shark_x = i;
				baby_shark_y = j;
				space[i][j] = 0;
			}
		}
	}

	while (true) {
		dist = vector<vector<int>>(20, vector<int>(20, 1e9 + 7));

		bfs();

		min_value = 1e9 + 7;

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (baby_shark_size > space[i][j] && space[i][j] > 0) {
					if (dist[i][j] > 0 && min_value > dist[i][j]) {
						baby_shark_x = i;
						baby_shark_y = j;
						min_value = dist[i][j];
					}
				}
			}
		}

		if (min_value == 1e9 + 7) {
			break;
		}

		eat_count += 1;
		space[baby_shark_x][baby_shark_y] = 0;
		grow();
		result += min_value;
	}

	cout << result << "\n";
	
	return 0;
}