Algorithm/BOJ

[백준 알고리즘/BOJ/C++] 1149 RGB거리

pinevienna 2021. 1. 31. 19:01

 

 

결국 똑같은 색의 집이 연속해서 나올 수 없다는 말을 복잡하게 설명...

배열로 입력받을 것이니 행, 열로 보자

(1) 같은 열의 수는 연속해서 더할 수 없다 (각 열이 빨강, 초록, 파랑을 의미하기 때문에 연속할 수 없다)

(2) 어떤 루트로 가야 최솟값이 될지 모른다 (1행에서 최솟값을 골라도 최종적으로 제일 작다는 보장은 없다)

(3) 다다음 행은 고려할 필요가 없다 (기준이 되는 행과 그 다음 행만 비교하면 됨)

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <algorithm>
using namespace std;
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
 
    int cost[1000][3], n;
    int dp[1000][3]; //각 루트마다 값을 저장해줄 배열
 
    cin >> n;
 
    for (int i = 0; i < n; i++) {
        cin >> cost[i][0>> cost[i][1>> cost[i][2];
    }
 
    dp[0][0= cost[0][0];
    dp[0][1= cost[0][1];
    dp[0][2= cost[0][2];
 
    for (int i = 1; i < n; i++) {
        dp[i][0= min(dp[i - 1][1], dp[i - 1][2]) + cost[i][0];
        dp[i][1= min(dp[i - 1][0], dp[i - 1][2]) + cost[i][1];
        dp[i][2= min(dp[i - 1][0], dp[i - 1][1]) + cost[i][2];
    }
 
    cout << min({ dp[n - 1][0], dp[n - 1][1], dp[n - 1][2] });
}
cs

 

입력값을 저장할 배열(cost) 외에 각 루트마다 값을 저장해줄 배열을(dp) 하나 더 만들어줌

dp[i][0] = i번째 집을 R, i-1번째 집을 R 제외 제일 싼 색으로 칠했을 때 비용의 합

dp[i][1] = i번째 집을 G, i-1번째 집을 G 제외 제일 싼 색으로 칠했을 때 비용의 합

dp[i][2] = i번째 집을 B, i-1번째 집을 B 제외 제일 싼 색으로 칠했을 때 비용의 합

처음엔 i번째 집을 기준으로 i+1번째 집을 어떤색으로 칠할지 정하려고 했으나..

i+1번째 집을 무슨 색으로 칠했는지 따로 저장해야하고..이것 저것 코드가 줄줄 늘어나서 역으로 계산했다

이 때 못참고 또 답 찾아봄..거의 다 풀어놓고 솔루션 검색해서 찝찝하게 끝내기 달인ㅎㅋ