미숙한 블로그 주인이 코딩테스트 문제를 풀어가는 과정을 담은 글입니다. 이 풀이가 효율적인 풀이가 아닐 수 있으며, 부정확한 정보가 많이 있을 수 있습니다. 보완해야할 점이 있다면 댓글로 남겨주세요!
https://www.acmicpc.net/problem/1149
RGB거리
문제
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. 이 과정을 N번 반복해 최솟값을 찾는다.
#include <iostream>
using namespace std;
const int INF = -1999999999;
int dp[1001][3];
int main() {
int N;
cin >> N;
int RGB[3];
// 처음 집들
cin >> dp[1][0];
cin >> dp[1][1];
cin >> dp[1][2];
for (int i = 2; i <= N; i++) {
cin >> RGB[0];
cin >> RGB[1];
cin >> RGB[2];
// 지금 빨간집을 칠하려면 이전의 집은 초록색이나 파란색을 지어야한다. 다른 색도 마찬가지.
dp[i][0] = min(dp[i - 1][1] + RGB[0], dp[i - 1][2] + RGB[0]);
dp[i][1] = min(dp[i - 1][0] + RGB[1], dp[i - 1][2] + RGB[1]);
dp[i][2] = min(dp[i - 1][0] + RGB[2], dp[i - 1][1] + RGB[2]);
}
cout << min(dp[N][0], min(dp[N][1], dp[N][2])) << endl;
return 0;
}
'코딩 테스트(Coding test) > BOJ' 카테고리의 다른 글
[BOJ 1463번/C++] 1로 만들기 (0) | 2022.09.14 |
---|---|
[BOJ 2579번/C++] 계단 오르기 (1) | 2022.09.13 |
[BOJ 1912번/C++] 연속합 (0) | 2022.09.11 |
[BOJ 9461번/C++] 파도반 수열 (0) | 2022.09.10 |
[BOJ 1904번/C++] 01타일 (0) | 2022.09.09 |