danbibibi
article thumbnail
Published 2023. 3. 23. 23:06
BOJ 17404번: RGB거리 2 문제 풀이/백준

문제

문제 바로가기> BOJ 17404번: RGB거리

 

17404번: RGB거리 2

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

www.acmicpc.net

 

풀이

BOJ 1149번: RGB거리1번집과 N번 집이 연결되어 있다는 조건이 조금 더 붙었다.

따라서 1번 집의 색상을 고정하고, 나머지 집들을 칠하는 방식으로 문제를 해결했다.

1번 집의 색상을 고정한 이유는 마지막 N번 집을 같은 색상으로 칠해주지 않기 위해서다!! (조건문을 통해 처리)

 

#include <iostream>
#define MAX 1002
using namespace std;

int N;
int cost[MAX][3], dp[MAX][3];

void input()
{
    cin >> N;
    for (int i = 1; i <= N; i++)
    {
        for (int j = 0; j < 3; j++)
            cin >> cost[i][j];
    }
}

void init()
{
    for (int i = 0; i <= N; i++)
    {
        for (int j = 0; j < 3; j++)
            dp[i][j] = MAX;
    }
}

void solution() // 모든 집을 칠하는 비용의 최솟값
{
    int ans = MAX * MAX;
    for (int c = 0; c < 3; c++)
    {
        // init
        init();

        // dp
        dp[1][c] = cost[1][c]; // 1번 집의 색상을 고정
        for (int r = 2; r <= N; r++)
        {
            dp[r][0] = min(dp[r - 1][1], dp[r - 1][2]) + cost[r][0];
            dp[r][1] = min(dp[r - 1][0], dp[r - 1][2]) + cost[r][1];
            dp[r][2] = min(dp[r - 1][0], dp[r - 1][1]) + cost[r][2];
        }

        // ans update
        if (c == 0)
            ans = min(ans, min(dp[N][1], dp[N][2]));
        else if (c == 1)
            ans = min(ans, min(dp[N][0], dp[N][2]));
        else if (c == 2)
            ans = min(ans, min(dp[N][0], dp[N][1]));
    }
    cout << ans;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    input();
    solution();
}

'문제 풀이 > 백준' 카테고리의 다른 글

BOJ 16724번: 피리 부는 사나이  (0) 2023.03.29
BOJ 2193번: 이친수  (0) 2023.03.28
BOJ 1766번: 문제집  (0) 2023.03.23
BOJ 1726번: 로봇  (0) 2023.03.23
BOJ 23309번: 철도 공사  (0) 2023.03.22
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로