본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 1149번 RGB거리

by 현장 2026. 1. 10.

-Code

import java.io.*;
import java.util.*;

public class BOJ1149 {
    public static void main(String[] args) throws IOException {
        BufferedReader br =
                new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        // rgb 비용 받기
        int[][] rgbVals = new int[n + 1][3];
        for (int i = 1; i <= n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < 3; j++) {
                rgbVals[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        // dp 초기화
        int[][] dp = new int[n + 1][3];
        for (int i = 0; i < 3; i++) {
            dp[1][i] = rgbVals[1][i];
        }
        // dp 계산
        for (int i = 2; i <= n; i++) {
            dp[i][0] = rgbVals[i][0] + Math.min(dp[i - 1][1], dp[i - 1][2]);
            dp[i][1] = rgbVals[i][1] + Math.min(dp[i - 1][0], dp[i - 1][2]);
            dp[i][2] = rgbVals[i][2] + Math.min(dp[i - 1][0], dp[i - 1][1]);
        }
        // 최소값 구하기
        int answer = Integer.MAX_VALUE;
        for (int i = 0; i < 3; i++) {
            answer = Math.min(answer, dp[n][i]);
        }
        System.out.println(answer);
    }
}

처음에는 상태 관리를 따로 해서 각각 구해야 하는지 모르고 기존 1차원 배열을 만들어 풀려하니 풀리지 않았습니다. 그래서 찾아보니 상태를 각각 관리하여야 했고 이후에는 dp를 기준으로 rgbVals에서 고를 수 있는 최솟값을 가지고 저장했는데 이것도 rgbVals를 기준으로 이전 dp의 최솟값을 더해서 저장을 하는 게 맞았습니다. 이 부분을 해결하니 통과하였습니다.