smooth waters run deep

1d-1c/BOJ

1149_RGB거리 (C++)

yeon_11 2020. 12. 29. 00:52
 

1149번: RGB거리

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

www.acmicpc.net

#include <iostream>
#include <cstring> //memset
#include <algorithm> //min
using namespace std;

int n;
int house[1001][3] = {0,};
int cal[1001][3] = {0,};

int main(){
    cin >> n;

    for(int i=0; i<n; i++){
        for(int j=0; j<3; j++){
            cin >> house[i][j];

            if(i==n-1){
                cal[i][j] = house[i][j];
            }
        }
    }

    for(int i=n-2; i>=0; i--){
        cal[i][0] = min(cal[i+1][1],cal[i+1][2]) + house[i][0];
        cal[i][1] = min(cal[i+1][0],cal[i+1][2]) + house[i][1];
        cal[i][2] = min(cal[i+1][0],cal[i+1][1]) + house[i][2];
    }

    cout << min({cal[0][0],cal[0][1],cal[0][2]});

    return 0;
}

 

RGB를 선택하는 모든 경우를 탐색하는 방식은 당연히! 시간초과가 난다.

 

 

나는 입력받은 배열의 가장 마지막 행을 기준으로 0행까지 올라가며 비용의 최솟값을 구했다.

 

 

예시)

 

2 1 3

2 1 5

5 4 3  를 입력받았을 때, 내가 푼 방식으로 비용의 최솟값을 구해보자.

 

비용을 계산하는 과정을 수행하기 전에, 가장 먼저 해주어야할 것은 시작점을 만들어야 한다.

우리는 가장 마지막 행(n-1번째 행)에서부터 올라갈 것이므로, 마지막 행이 시작점(기준)이 된다.

 

 

n-2번째 행 ~ 0번째 행까지 계산 과정은 다음과 같다.

X행의 세 가지 숫자는 X+1행의 숫자를 기준으로 변경된다.

X행0열 은 X행0열의 비용 +  X+1행1열과 2열의 최솟값,

X행1열 은 X행1열의 비용 +  X+1행0열과 2열의 최솟값,

X행2열 은 X행2열의 비용 +  X+1행0열과 1열의 최솟값 으로 계산할 수 있다.

 

 

 

위의 과정을 n-2번째 행 ~ 0행까지 수행하면,

0행0열의 숫자는 : 첫 번째 숫자를 R색상으로 선택했을 때의 총 최소 비용,

0행1열의 숫자는 : 첫 번째 숫자를 G색상으로 선택했을 때의 총 최소 비용,

0행2열의 숫자는 : 첫 번째 숫자를 B색상으로 선택했을 때의 총 최소 비용 을 의미한다.

 

그러므로, 모든 경우 중에서의 최소 비용은 0행0열,0행1열,0행2열 중 최솟값이 된다.

 

 

 

'1d-1c > BOJ' 카테고리의 다른 글

1781_컵라면 (C++)  (0) 2021.06.24
1260_DFS와 BFS (C++)  (0) 2020.12.22
1932_정수 삼각형 (JAVA)  (0) 2020.12.18
14889_스타트와 링크 (JAVA)  (0) 2020.12.15
10814_나이순 정렬 (JAVA)  (0) 2020.12.05