알고리즘/문제 풀이

1149번: RGB거리

Themion 2021. 12. 6. 23:16

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

 

1149번: RGB거리

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

www.acmicpc.net

i번 집의 색이 i - 1번 집의 색과 달라야 하므로 i번 집을 k번째 색으로 색칠할 때까지 사용되는 비용의 합은

i - 1번 집을 k가 아닌 색으로 색칠할 때까지 사용되는 비용의 합 + i번 집을 k번째 색으로 색칠하는 비용이다.

#include <cstdio>

#define MAX_N 1000

// col[i][j] : i번째 집을 j번째 색으로 칠할 때 드는 비용
int col[MAX_N + 1][3] = {{ 0, }};

int min(int a, int b) { return a < b ? a : b; }

int main() {
    // 집의 개수
    int N;
    scanf("%d", &N);

    // i번 집을 색칠할 때
    for (int i = 1; i <= N; i++) {
        scanf("%d %d %d", &col[i][0], &col[i][1], &col[i][2]);

        // 이전 집을 현재 집과 다른 색으로 칠할 때까지의 총 비용을
        // 현재 집을 현재 색으로 칠하는 비용에 더한다
        col[i][0] += min(col[i - 1][1], col[i - 1][2]);
        col[i][1] += min(col[i - 1][0], col[i - 1][2]);
        col[i][2] += min(col[i - 1][0], col[i - 1][1]);
    }

    // col[N]에는 모든 집의 최소 비용이 저장되어 있으므로
    // 이 세 최소비용 중 최솟값을 출력한다
    printf("%d\n", min(col[N][0], min(col[N][1], col[N][2])));

    return 0;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

1157번: 단어 공부  (0) 2021.12.07
1152번: 단어의 개수  (0) 2021.12.07
1110번: 더하기 사이클  (0) 2021.12.06
1107번: 리모컨  (0) 2021.12.06
1100번: 하얀 칸  (0) 2021.12.06