백준 알고리즘/백준 CLASS 5
[백준 C++] 17404번: RGB거리 2
code_killer
2023. 10. 2. 17:01
728x90
반응형
1. 문제
https://www.acmicpc.net/problem/17404
17404번: RGB거리 2
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
2. 알고리즘 분류
- 다이나믹 프로그래밍
3. 소스 코드
Key Point)
1. 다이나믹 프로그래밍을 통해 최소 비용을 구해 나간다.
2. 빨강 or 파랑 or 초록 시작으로 총 3가지 경우의 수를 각자 계산해 나간다.
#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 987654321;
int rgb[1000][3];
int dp[1000][3];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// 집의 수(N) 입력
int N;
cin >> N;
// 빨강, 초록, 파랑 비용 입력
for (int i = 0; i < N; i++)
cin >> rgb[i][0] >> rgb[i][1] >> rgb[i][2];
int ans = MAX;
// 빨강 or 초록 or 파랑 시작 (총 3번 경우의 수 계산)
for (int i = 0; i < 3; i++)
{
// 시작 색을 제외하고는 비용을 MAX로 지정하여, 계산하지 않게 설정
for (int j = 0; j < 3; j++)
{
if (i == j) dp[0][j] = rgb[0][j];
else dp[0][j] = MAX;
}
// 이전 색을 제외하고 가장 작은 비용의 색을 선택하여 더하기
for (int j = 1; j < N; j++)
{
dp[j][0] = rgb[j][0] + min(dp[j - 1][1], dp[j - 1][2]);
dp[j][1] = rgb[j][1] + min(dp[j - 1][0], dp[j - 1][2]);
dp[j][2] = rgb[j][2] + min(dp[j - 1][0], dp[j - 1][1]);
}
// 시작 색을 제외하고 발생한 비용 중에서 가장 작은 비용을 ans에 갱신
for (int j = 0; j < 3; j++)
{
if (i == j) continue;
else ans = min(ans, dp[N - 1][j]);
}
}
// 정답 출력
cout << ans;
return 0;
}
728x90