coding_test/BAEKJOON

백준 1149번 C++ 풀이

CodeJin 2022. 4. 11. 20:22

https://www.acmicpc.net/problem/1149

 

1149번: RGB거리

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나

www.acmicpc.net

시간 제한 메모리 제한 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]);
}