<문제>
RGB거리에 사는 사람들은 집을 빨강, 초록, 파랑중에 하나로 칠하려고 한다. 또한, 그들은 모든 이웃은 같은 색으로 칠할 수 없다는 규칙도 정했다. 집 i의 이웃은 집 i-1과 집 i+1이다. 처음 집과 마지막 집은 이웃이 아니다.
각 집을 빨강으로 칠할 때 드는 비용, 초록으로 칠할 때 드는 비용, 파랑으로 드는 비용이 주어질 때, 모든 집을 칠할 때 드는 비용의 최솟값을 구하는 프로그램을 작성하시오.
<정답 코드>
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include <iostream> #define MAX 1001 using namespace std; typedef struct { int f_i, s_i, t_i; } tmi; int N; int cost[MAX][3]; tmi min(int i) { if (cost[i][0] <= cost[i][1] && cost[i][0] <= cost[i][2]) if (cost[i][1] <= cost[i][2]) return { 0, 1, 2 }; else return { 0, 2, 1 }; else if (cost[i][1] <= cost[i][0] && cost[i][1] <= cost[i][2]) if (cost[i][0] <= cost[i][2]) return { 1, 0, 2 }; else return { 1, 2, 0 }; else if (cost[i][2] <= cost[i][0] && cost[i][2] <= cost[i][1]) if (cost[i][0] <= cost[i][1]) return { 2, 0, 1 }; else return { 2, 1, 0 }; return { -1, -1, -1 }; } int main() { cin >> N; for (int i = 0; i < N; i++) for (int j = 0; j < 3; j++) cin >> cost[i][j]; for (int i = 0; i < N - 1; i++) { if (min(i + 1).f_i == min(i).f_i) { cost[i + 1][min(i + 1).t_i] += cost[i][min(i).f_i]; cost[i + 1][min(i + 1).s_i] += cost[i][min(i).f_i]; cost[i + 1][min(i + 1).f_i] += cost[i][min(i).s_i]; } else if (min(i + 1).s_i == min(i).f_i) { cost[i + 1][min(i + 1).t_i] += cost[i][min(i).f_i]; cost[i + 1][min(i + 1).s_i] += cost[i][min(i).s_i]; cost[i + 1][min(i + 1).f_i] += cost[i][min(i).f_i]; } else if (min(i + 1).t_i == min(i).f_i) { cost[i + 1][min(i + 1).t_i] += cost[i][min(i).s_i]; cost[i + 1][min(i + 1).s_i] += cost[i][min(i).f_i]; cost[i + 1][min(i + 1).f_i] += cost[i][min(i).f_i]; } } cout << cost[N - 1][min(N - 1).f_i] << endl; return 0; } | cs |
<압축 코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include<iostream> int q, w, e, a, s, d, r, g, b, n, i; int main() { std::cin >> n; while (n > 0) { std::cin >> r >> g >> b; a = w < e ? w : e; s = q < e ? q : e; d = q < w ? q : w; q = a + r; w = s + g; e = d + b; --n; } std::cout << (q<w ? (q<e ? q : e) : (e<w ? e : w)); return 0; } | cs |
'C++ 문제풀이' 카테고리의 다른 글
| 2457번 백준(Baekjoon) (0) | 2018.10.12 |
|---|---|
| 1068번 백준(Baekjoon) (0) | 2018.10.04 |
| 2579번 백준(Baekjoon) (0) | 2018.10.02 |
| 1520번 백준(Baekjoon) (0) | 2018.10.01 |
| 9095번 백준(Baekjoon) (0) | 2018.09.30 |