문제 출처: https://www.acmicpc.net/problem/1149



세 이웃 간 색깔이 달라야 하는 것이 아니라, 두 이웃 간 색깔이 다르면 된다. (ex: 빨강 초록 빨강)


DP(Dynamic Programming)로 푼다.

cost[0][0] = 26  // 집1을 빨강으로 칠할 때 비용 

cost[0][1] = 40  // 집1을 초록으로 칠할 때 비용 

cost[0][2] = 83  // 집1을 파랑으로 칠할 때 비용 

cost[1][0] = min(cost[0][1], cost[0][2]) + cost[1][0]  // 집1을 초록과 파랑으로 칠할 때 비용 중 최솟값과, 집2를 빨강으로 칠할 때 비용

cost[1][1] = min(cost[0][0], cost[0][2]) + cost[1][1]  // 집1을 빨강과 파랑으로 칠할 때 비용 중 최솟값과, 집2를 초록으로 칠할 때 비용

cost[1][2] = min(cost[0][0], cost[0][1]) + cost[1][2]  // 집1을 빨강과 초록으로 칠할 때 비용 중 최솟값과, 집2를 파랑으로 칠할 때 비용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
 
public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(reader.readLine());
        int[][] cost = new int[N][3];
 
        for(int i=; i<N ; i++){
            String[] input = reader.readLine().split(" ");
            cost[i][0= Integer.parseInt(input[0]);
            cost[i][1= Integer.parseInt(input[1]);
            cost[i][2= Integer.parseInt(input[2]);
        }
 
        for(int i=; i<N ; i++){
        // cost[i][0] = 집 i을 빨강으로 칠할 때 비용 + 집 i-1을 빨강을 제외한 나머지 색들로 칠할 때의 비용 중 최소값
            cost[i][0+= Math.min(cost[i-1][1], cost[i-1][2]); // 49 += (40, 83)
            cost[i][1+= Math.min(cost[i-1][0], cost[i-1][2]); // 60 += (26, 83)
            cost[i][2+= Math.min(cost[i-1][0], cost[i-1][1]); // 57 += (26, 40)
        }
 
        Arrays.sort(cost[N-1]);
        System.out.println(cost[N-1][0]);
    }
}
cs



'Algorithm' 카테고리의 다른 글

백준 1932번: 정수 삼각형  (0) 2018.11.01
백준 2749번: 피보나치 수 3  (0) 2018.10.31
백준 2748번: 피보나치 수 2  (0) 2018.10.31
백준 2747번: 피보나치 수  (0) 2018.10.31
백준 2667번: 단지번호붙이기  (0) 2018.10.26

+ Recent posts