이번 문제는 일렬로 늘어선 집들이 있을 때, 여기에 빨강, 초록, 파랑색으로 집을 색칠하는 것입니다. 색마다 칠하는 비용이 집마다 주어지고, 이웃간에는 색을 달리 칠해야 합니다. 최소의 비용으로 칠을 할 때, 그 비용은 얼마인 가입니다.

문제의 난이도는 Silver I 문제입니다. 정답률도 47.2%로 적당한 수준의 문제입니다. 기초적인 알고리즘 지식만 있으면 풀 수 있는 문제입니다.
https://www.acmicpc.net/problem/1149
1149번: RGB거리
RGB거리에 사는 사람들은 집을 빨강, 초록, 파랑중에 하나로 칠하려고 한다. 또한, 그들은 모든 이웃은 같은 색으로 칠할 수 없다는 규칙도 정했다. 집 i의 이웃은 집 i-1과 집 i+1이고, 첫 집과 마지막 집은 이웃이 아니다. 각 집을 빨강으로 칠할 때 드는 비용, 초록으로 칠할 때 드는 비용, 파랑으로 드는 비용이 주어질 때, 모든 집을 칠하는 비용의 최솟값을 구하는 프로그램을 작성하시오.
www.acmicpc.net
이 문제는 동적 프로그래밍을 이용하면 됩니다. k번째 집에 색을 칠하는 비용을
로 놓을 수 있습니다.
이래서 최종적으로
이 알고리즘으로 제가 작성한 소스코드입니다. 소스코드는 참고용으로 봐주세요.
//--------------------------------------------------------------------
// baekjoon #1149 - RGB Street
// - by Aubrey Choi
// - created at 2019-06-02
//--------------------------------------------------------------------
#include <stdio.h>
int min(int a, int b) { return a < b ? a : b; }
int min(int a, int b, int c)
{
int min = a;
if(b < min) min = b;
if(c < min) min = c;
return min;
}
int main()
{
int n, r, g, b;
int dp[1000][3];
scanf("%d", &n);
scanf("%d%d%d", dp[0], dp[0] + 1, dp[0] + 2);
for(int i = 1; i < n; i++)
{
scanf("%d%d%d", &r, &g, &b);
dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + r;
dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + g;
dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + b;
}
printf("%d\n", min(dp[n - 1][0], dp[n - 1][1], dp[n - 1][2]));
}
반응형
'Programming > BOJ' 카테고리의 다른 글
백준 #1194 달이 차오른다, 가자 (0) | 2020.01.06 |
---|---|
백준 #1153 네 개의 소수 (0) | 2020.01.05 |
백준 #1141 접두사 (0) | 2020.01.05 |
백준 #1138 한 줄로 서기 (0) | 2020.01.04 |
백준 #1132 합 (0) | 2020.01.04 |
댓글