hades

[Baekjoon] 1149๋ฒˆ: RGB๊ฑฐ๋ฆฌ ๋ณธ๋ฌธ

๐Ÿ‘Š PS/Algorithm

[Baekjoon] 1149๋ฒˆ: RGB๊ฑฐ๋ฆฌ

hades1 2024. 8. 2. 19:58

๐Ÿฅ… ๋ฌธ์ œ

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

 

๐Ÿ” ์„ค๊ณ„

๋ฐ”๋กœ ์ด์ „ ์ง‘์—์„œ์˜ ์ƒ‰๊ณผ ๋‹ค๋ฅธ ์ƒ‰์„ ์น ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ์ง‘์„ ๊ณ ๋ คํ•  ๋•Œ๋งˆ๋‹ค ํ์—์„œ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ์น ํ•  ์ƒ‰์„ ๊ฒฐ์ •ํ•œ๋‹ค. ํ์—๋Š” ์ด์ „ ์ง‘์—์„œ์˜ ์ƒ‰๊ณผ ๋น„์šฉ์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ, ์น ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ‰์— ๋Œ€ํ•˜์—ฌ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•  ๊ฒฝ์šฐ, ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

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

 


ํ๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ , ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ๊ฐ™๋‹ค.

 

๐Ÿ‘Š ํ’€์ด1

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

int n, result = 1e9 + 7;
queue<pair<int, int>> q;
vector<vector<int>> cur_min_cost(1000, vector<int>(3, 1e9 + 7));
vector<vector<int>> costs;
vector<int> cost(3);

void bfs() {
	for (int i = 0; i < 3; i++) {
		q.push({ i, costs[0][i] });
	}
	for (int i = 1; i < n; i++) {
		int size = q.size();
		for (int k = 0; k < size; k++) {
			int before_color = q.front().first;
			int before_cost = q.front().second;
			q.pop();
			for (int j = 0; j < 3; j++) {
				if (j != before_color) {
					int cur_color = j;
					int cur_cost = before_cost + costs[i][j];
					cur_min_cost[i][j] = min(cur_min_cost[i][j], cur_cost);
				}
			}
		}
		for (int j = 0; j < 3; j++) {
			q.push({ j, cur_min_cost[i][j] });
		}
	}
	while (!q.empty()) {
		result = min(result, q.front().second);
		q.pop();
	}
}

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 < 3; j++) {
			cin >> cost[j];
		}
		costs.push_back(cost);
	}
	
	bfs();
	cout << result << "\n";

	return 0;
}

 

๐Ÿ‘Š ํ’€์ด2

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

int n, result = 1e9 + 7;
queue<pair<int, int>> q;
vector<vector<int>> cur_min_cost(1000, vector<int>(3, 1e9 + 7));
vector<vector<int>> costs;
vector<int> cost(3);

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 < 3; j++) {
			cin >> cost[j];
		}
		costs.push_back(cost);
	}
	
	for (int i = 0; i < 3; i++) {
		cur_min_cost[0][i] = costs[0][i];
	}

	for (int i = 1; i < n; i++) {
		for (int j = 0; j < 3; j++) {
			for (int k = 0; k < 3; k++) {
				if (j != k) {
					cur_min_cost[i][j] = min(cur_min_cost[i][j], cur_min_cost[i - 1][k] + costs[i][j]);
				}
			}
		}
	}

	for (int i = 0; i < 3; i++) {
		result = min(result, cur_min_cost[n - 1][i]);
	}

	cout << result << "\n";

	return 0;
}