https://www.acmicpc.net/problem/1149
시간 제한 | 메모리 제한 | solved.ac 티어 |
0.5초 (추가시간 없음) | 128MB | 실버1 |
문제
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보다 작거나 같은 자연수이다.
출력
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
i번째의 집을 칠하기 위해서는, (i번째와 다른 색으로 칠했을때의 i - 1번째 집의 비용) + (i번째 색칠 비용)의 값과 같다. 맨 처음집부터 시작하여, 이 두 값의 최솟값(하나의 색을 골랐다면, 다른 색은 두개가 있기 때문에)을 저장하며, 반복문을 돌고, 맨 마지막에 도달했을 때의 최종적인 비용의 최솟값을 찾아준다.
#include <bits/stdc++.h>
using namespace std;
int main () {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n;
int rgb_cost[3];
int house[1001][3] = {0, 0, 0, };
cin >> n;
for(int i = 1; i <= n; i++) {
for(int j = 0; j < 3; j++) cin >> rgb_cost[j];
for(int j = 0; j < 3; j++) {
house[i][j] = min(house[i - 1][(j + 1) % 3], house[i - 1][(j + 2) % 3]) + rgb_cost[j];
}
}
cout << min(min(house[n][0], house[n][1]), house[n][2]);
}
'coding_test > BAEKJOON' 카테고리의 다른 글
백준 1935번 C++ 풀이 (0) | 2022.05.03 |
---|---|
백준 1918번 C++ 풀이 (0) | 2022.05.03 |
백준 1912번 C++ 풀이 (0) | 2022.04.09 |
백준 9655번 C++ 풀이 (0) | 2022.04.05 |
백준 17266번 C++ 풀이 (0) | 2022.04.02 |