본문 바로가기

Algorithm/Baekjoon Oline Judge - Java

[백준] 1149 RGB거리 / 동적계획법 DP

 

 

Sliver

 

문제

 

RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.

집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.

  • 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
  • N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
  • i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.

 

입력

 

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

 

출력

 

첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.

 


 

풀이

 

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

class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[][] arr = new int[N][3];
        int[][] val = new int[N][3];
        StringTokenizer st;
        for(int i=0; i<N; i++){
            st = new StringTokenizer(br.readLine());
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());
            arr[i][2] = Integer.parseInt(st.nextToken());
        }

        val[0][0] = arr[0][0] ;
        val[0][1] = arr[0][1] ;
        val[0][2] = arr[0][2] ;
                                         
        for(int i=1; i<N; i++){
            val[i][0] = arr[i][0] + Math.min(val[i-1][1],val[i-1][2]);
            val[i][1] = arr[i][1] + Math.min(val[i-1][0],val[i-1][2]);
            val[i][2] = arr[i][2] + Math.min(val[i-1][1],val[i-1][0]);            
        }

        int minVal = Math.min(val[N-1][0], Math.min(val[N-1][1], val[N-1][2]));
        
        System.out.println(minVal);
    }
}

 

해결방법

  1. arr 배열에 모든 비용을 저장한다.
  2. val에 첫번째 집의 비용을 저장한다. 
  3. 두 번째 집부터는 이전집의 다른 색의 최소 비용을 더하여 현재비용을 계산한다. 
  4. 마지막 집의 세 가지 색 중 최소 비용을 출력한다. 

 

 


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