Post

[Silver I] RGB거리 - 1149

[Silver I] RGB거리 - 1149

문제 링크

문제 링크

성능 요약

메모리: 2468 KB, 시간: 0 ms

문제 설명

RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.

집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.

  • 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
  • N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
  • i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.

입력

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.

코드

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
#include <iostream>
#include <vector>
#include <unordered_map>
#include <string>
#include <algorithm>

using namespace std;

int N; // 집 개수

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

	cin >> N;
	vector<unordered_map<string, int>> cost(N); // 색칠비용(R,G,B)

	int r, g, b;

	// 초기 설정
	cin >> r >> g >> b;
	cost[0]["red"] = r;
	cost[0]["green"] = g;
	cost[0]["blue"] = b;

	// 코스트 입력
	for (int i = 1; i < N; i++)
	{
		cin >> r >> g >> b;
		// i번째 색칠 코스트 계산
		cost[i]["red"] += r + min(cost[i - 1]["green"], cost[i - 1]["blue"]); // 이전 min(g,b) 칠하는 cost + r 칠하는 cost
		cost[i]["green"] += g + min(cost[i - 1]["red"], cost[i - 1]["blue"]); // 이전 min(r,b) 칠하는 cost + g 칠하는 cost
		cost[i]["blue"] += b + min(cost[i - 1]["red"], cost[i - 1]["green"]); // 이전 min(r,g) 칠하는 cost + b 칠하는 cost
	}

	// N번째 칠하는 값중 작은 값
	cout << min({ cost[N - 1]["red"], cost[N - 1]["green"], cost[N - 1]["blue"] });

	return 0;
}

This post is licensed under CC BY 4.0 by the author.