[백준] 1149번 RGB 거리 - Java, 자바

Kim Ji Eun·2022년 1월 17일
0

DP

목록 보기
15/17

난이도

실버 1

문제

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

풀이

  1. 테이블 정의하기
    dp[i] = i번째 집일 때 집을 칠하는 최소 비용

  2. 점화식 찾기
    i번째 집이 빨강일 때(0),
    i-1번째 집이 초록집이거나 파랑인 경우에 최솟값과 빨강일 때의 값을 더해줍니다.
    i번째 집이 초록일 때(1), i번째 집이 파랑일 때(2)도 위와 같은 방식으로 식을 채워줍니다.

dp[i][0] = Math.min(dp[i - 1][1], dp[i - 1][2]) + r;
dp[i][1] = Math.min(dp[i - 1][0], dp[i - 1][2]) + g;
dp[i][2] = Math.min(dp[i - 1][0], dp[i - 1][1]) + b;

  1. 초기값 정의하기
    없음

출력은 dp[n][0], dp[n][1], dp[n][2] 중 최솟값을 출력합니다.

코드


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

// 1149번 RGB 거리
public class boj_2_1149 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

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

        int[][] dp = new int[n + 1][3];

        for (int i = 1; i <= n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int r = Integer.parseInt(st.nextToken());
            int g = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            dp[i][0] = Math.min(dp[i - 1][1], dp[i - 1][2]) + r;
            dp[i][1] = Math.min(dp[i - 1][0], dp[i - 1][2]) + g;
            dp[i][2] = Math.min(dp[i - 1][0], dp[i - 1][1]) + b;
        }
        System.out.println(Math.min(dp[n][0], Math.min(dp[n][1], dp[n][2])));

    }
}
profile
Back-End Developer

0개의 댓글