BOJ_17404_RGB거리 2_java

2023. 1. 24. 12:29Algorithm/BOJ

728x90

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

 

17404번: RGB거리 2

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

www.acmicpc.net

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

/**
 백준 17404번 RGB거리 2
 골드 4
 */
public class BOJ_17404_RGB거리2 {
    private static final int INF = 123456789;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());
        int[][] map = new int[N][3];
        for (int i = 0 ; i< N; i++){
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j<3; j++){ // R, G, B 순서 비용
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        System.out.println(solve(N, map));
    }

    public static long solve(int N, int map[][]){
        long[][] dp = new long[N][3];

        long min = INF;
        for (int i = 0; i<3; i++){ // 0번 집 색상
            for (int j = 0; j<N; j++){
                if (j==0){
                    if (i == 0){ // 처음 집 r
                        dp[0][0] = map[0][0];
                        dp[0][1] = INF; //다른 집 선택 안하도록
                        dp[0][2] = INF;
                    }else if(i == 1){ // 처음 집 g
                        dp[0][0] = INF;
                        dp[0][1] = map[0][1];
                        dp[0][2] = INF;
                    }else if(i==2){ // 처음 집 b
                        dp[0][0] = INF;
                        dp[0][1] = INF;
                        dp[0][2] = map[0][2];
                    }
                }else{
                    dp[j][0] = Math.min(dp[j-1][1], dp[j-1][2]) + map[j][0];
                    dp[j][1] = Math.min(dp[j-1][0], dp[j-1][2]) + map[j][1];
                    dp[j][2] = Math.min(dp[j-1][0], dp[j-1][1]) + map[j][2];
                }
            }
            if (i == 0){ // 처음 집 r
                min = Math.min(min, Math.min(dp[N-1][1], dp[N-1][2]));
            }else if(i == 1){ // 처음 집 g
                min = Math.min(min, Math.min(dp[N-1][0], dp[N-1][2]));
            }else if(i==2){ // 처음 집 b
                min = Math.min(min, Math.min(dp[N-1][0], dp[N-1][1]));
            }
        }
        return min;
    }

    public static void printmap(int[][] map){ // 입력 테스트
        System.out.println();
        for (int i = 0; i<map.length; i++){
            for (int j = 0; j<map[i].length; j++){
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
    }
    public static void printmap(long[][] map){ // 입력 테스트
        System.out.println();
        for (int i = 0; i<map.length; i++){
            for (int j = 0; j<map[i].length; j++){
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

BOJ_2143_두 배열의 합  (0) 2023.02.02
BOJ_20040_사이클게임_java  (0) 2023.01.30
BOJ_10942_팰린드롬?_java  (0) 2023.01.24
BOJ_17427_약수의 합 2_java  (0) 2023.01.14
BOJ_9252_LCS 2_java  (0) 2023.01.13