[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.