𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 1149번: RGB거리 - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 1149번: RGB거리 - C++

.23 2022. 7. 4. 18:21
문제

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보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 λͺ¨λ“  집을 μΉ ν•˜λŠ” λΉ„μš©μ˜ μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.


λ™μ κ³„νšλ²•μ„ μ΄μš©ν•˜λŠ” 문제.

μ•žμ˜ μœ ν˜•λ“€κ³Ό λ‹€λ₯Ό 것 없이 ν’€λ©΄ λœλ‹€.

 

각 μ§‘μ˜ R, G, B λΉ„μš©λ³„λ‘œ 합을 κ΅¬ν•œ λ’€ κ·Έ 쀑 κ°€μž₯ μž‘μ€ 값이 총 λΉ„μš©μ΄ λœλ‹€.

이 λ•Œ, i번째 μ§‘μ˜ 색은 i - 1번, i + 1번 μ§‘μ˜ 색과 같지 μ•Šμ•„μ•Ό ν•˜λŠ” μ‘°κ±΄λ•Œλ¬Έμ—

 

- i번째 μ§‘μ˜ RλΉ„μš©μ€ (i - 1)λ²ˆμ§ΈκΉŒμ§€μ˜ GλΉ„μš©κ³Ό BλΉ„μš©μ˜ ν•© 쀑 더 μž‘μ€ κ°’

- i번째 μ§‘μ˜ GλΉ„μš©μ€ (i - 1)λ²ˆμ§ΈκΉŒμ§€μ˜ RλΉ„μš©κ³Ό BλΉ„μš©μ˜ ν•© 쀑 더 μž‘μ€ κ°’

- i번째 μ§‘μ˜ BλΉ„μš©μ€ (i - 1)λ²ˆμ§ΈκΉŒμ§€μ˜ RλΉ„μš©κ³Ό GλΉ„μš©μ˜ ν•© 쀑 더 μž‘μ€ κ°’

 

에 각각 더해주면 λœλ‹€.

 

이λ₯Ό μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

sum[i][R] = min(sum[i - 1][G], sum[i - 1][B]) + color[i][R]

sum[i][G] = min(sum[i - 1][R], sum[i - 1][B]) + color[i][G]

sum[i][B] = min(sum[i - 1][R], sum[i - 1][G]) + color[i][B]

 

μ½”λ“œ
#include <cstdio>
#define MAX 1001

int N;
int color[MAX][3];
// [i][0] : R, [i][1] : G, [i][2] : B
int DP();
int min(int a, int b) {
    return (a < b ? a : b);
}
int main(void) {
    scanf("%d", &N);
    for (int i = 0; i < N; i++) {
        for(int j = 0; j < 3; j++) {
            scanf("%d", &color[i][j]);
        }
    }

    printf("%d\n", DP());
    return 0;
}

int DP() {
    int sum[MAX][3];
    for(int i = 0; i < 3; i++) {
        sum[0][i] = color[0][i];
    }
    
    for(int i = 1; i < N; i++) {
        sum[i][0] = min(sum[i - 1][1], sum[i - 1][2]) + color[i][0];
        sum[i][1] = min(sum[i - 1][0], sum[i - 1][2]) + color[i][1];
        sum[i][2] = min(sum[i - 1][0], sum[i - 1][1]) + color[i][2];
    }

    int result = min(min(sum[N - 1][0], sum[N - 1][1]), sum[N - 1][2]);

    return result;
}
Comments