본문 바로가기
알고리즘/백준

백준 1149번 - RGB거리 (Java)

by latissimus 2022. 3. 29.

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

 

1149번: RGB거리

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

www.acmicpc.net

코드 :

dp - bottom up

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int seq[][];
    static int dp[][];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int N = Integer.parseInt(br.readLine());
        seq = new int[N][3];
        dp = new int[N][3];

            for (int i = 0; i < N; i++) {
                st = new StringTokenizer(br.readLine());
                seq[i][0] = Integer.parseInt(st.nextToken()); // Red
                seq[i][1] = Integer.parseInt(st.nextToken()); // Green
                seq[i][2] = Integer.parseInt(st.nextToken()); // Blue
            }
            dp[0][0] = seq[0][0];
            dp[0][1] = seq[0][1];
            dp[0][2] = seq[0][2];

        for (int i = 1; i < N; i++) {
            dp[i][0] += seq[i][0] + Math.min(dp[i - 1][1] , dp[i - 1][2]);
            dp[i][1] += seq[i][1] + Math.min(dp[i - 1][2] , dp[i - 1][0]);
            dp[i][2] += seq[i][2] + Math.min(dp[i - 1][0] , dp[i - 1][1]);
        }
        int answer = Math.min(dp[N - 1][0], Math.min(dp[N - 1][1], dp[N - 1][2]));
        System.out.println(answer);
    }
}

풀이 :

요약하면 연속해서 같은 색깔로 칠하면 안된다는 내용이다.

dp[N][0~2] 는 N번째까지 집을 칠했을때, N번째를 해당 색깔[0~2]로 칠할때 최소값을 의미한다. 순차적으로 값을 저장하면 된다. 

 

 

마지막 for문 부분에 처음에 실수로 '+='를 먼저 썼는데,  '+'보다 속도가 빠르다고 나오는데 이유를 모르겠다. 찾아도 잘 안나온다.

 

 

댓글