본문 바로가기

코딩 테스트(Coding test)/BOJ

[BOJ 1149번/C++] RGB거리

미숙한 블로그 주인이 코딩테스트 문제를 풀어가는 과정을 담은 글입니다. 이 풀이가 효율적인 풀이가 아닐 수 있으며, 부정확한 정보가 많이 있을 수 있습니다. 보완해야할 점이 있다면 댓글로 남겨주세요!

 

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

 

1149번: RGB거리

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

www.acmicpc.net

RGB거리

문제

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보다 작거나 같은 자연수이다.

출력

첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.

 

풀이

규칙이 좀 거창하게 쓰여있지만, 쉽게 말하면 그냥 인접한 집 끼리는 색이 달라야한다는 의미이다..

 

1. 칠할 집의 색과 겹치지 않는 이전 색의 집을 택한다.

2. 그 두 집 중 비용이 더 적은 집과 더한다.

3. 이 과정을 N번 반복해 최솟값을 찾는다.

 

#include <iostream>

using namespace std;

const int INF = -1999999999;
int dp[1001][3];

int main() {
    int N;
    cin >> N;
    int RGB[3];

    // 처음 집들
    cin >> dp[1][0];
    cin >> dp[1][1];
    cin >> dp[1][2];

    for (int i = 2; i <= N; i++) {
        cin >> RGB[0];
        cin >> RGB[1];
        cin >> RGB[2];

        // 지금 빨간집을 칠하려면 이전의 집은 초록색이나 파란색을 지어야한다. 다른 색도 마찬가지.
        dp[i][0] = min(dp[i - 1][1] + RGB[0], dp[i - 1][2] + RGB[0]);
        dp[i][1] = min(dp[i - 1][0] + RGB[1], dp[i - 1][2] + RGB[1]);
        dp[i][2] = min(dp[i - 1][0] + RGB[2], dp[i - 1][1] + RGB[2]);
    }

    cout << min(dp[N][0], min(dp[N][1], dp[N][2])) << endl;

    return 0;
}

 

 

'코딩 테스트(Coding test) > BOJ' 카테고리의 다른 글

[BOJ 1463번/C++] 1로 만들기  (0) 2022.09.14
[BOJ 2579번/C++] 계단 오르기  (1) 2022.09.13
[BOJ 1912번/C++] 연속합  (0) 2022.09.11
[BOJ 9461번/C++] 파도반 수열  (0) 2022.09.10
[BOJ 1904번/C++] 01타일  (0) 2022.09.09