[BOJ] 1149번 RGB거리 - JAVA

최영환·2023년 2월 5일
0

BaekJoon

목록 보기
41/87
post-thumbnail

💡 문제

💬 입출력 예시


📌 풀이(소스코드)

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

public class Main {
    static int n;
    static int[][] dp;

    public static void main(String[] args) throws IOException {
        init();
        process();
        print();
    }

    private static void init() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        dp = new int[n][3];

        StringTokenizer st = null;
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < 3; j++) {
                dp[i][j] = Integer.parseInt(st.nextToken());
            }
        }
    }

    private static void process() {
        // 현재 집을 각각의 색으로 칠하는 비용 = 이전집이 다른 색으로 칠 했을때의 비용 중 최소 + 현재 집의 비용
        for (int i = 1; i < n; i++) {
            dp[i][0] = Math.min(dp[i - 1][1], dp[i - 1][2]) + dp[i][0];
            dp[i][1] = Math.min(dp[i - 1][0], dp[i - 1][2]) + dp[i][1];
            dp[i][2] = Math.min(dp[i - 1][0], dp[i - 1][1]) + dp[i][2];
        }
    }

    private static void print() {
        System.out.println(Math.min(dp[n - 1][0], Math.min(dp[n - 1][1], dp[n - 1][2])));
    }

📄 해설

  • R,G,B 는 각각 0,1,2 번 인덱스로 표현
  • i번 집이 R,G,B 로 칠했을 때의 세 경우에 대하여 계산을 해줌
    • 현재 집을 각각의 색으로 칠하는 비용 = 이전집이 다른 색으로 칠 했을때의 비용 중 최소 + 현재 집의 비용
      1. dp[i][0] = Math.min(dp[i-1][1], dp[i-1][2]) + dp[i][0]; // R
      2. dp[i][1] = Math.min(dp[i-1][0], dp[i-1][2]) + dp[i][1]; // G
      3. dp[i][2] = Math.min(dp[i-1][0], dp[i-1][1]) + dp[i][2]; // B
  • n-1 번 인덱스에 각각의 최솟값들이 저장되어있고, 이들 중 최솟값을 찾으면 해결
profile
조금 느릴게요~

0개의 댓글