본문 바로가기
공부/알고리즘

백준1149_RGB거리

by 미네밍 2016. 11. 21.

문제

RGB거리에 사는 사람들은 집을 빨강, 초록, 파랑중에 하나로 칠하려고 한다. 또한, 그들은 모든 이웃은 같은 색으로 칠할 수 없다는 규칙도 정했다. 집 i의 이웃은 집 i-1과 집 i+1이다. 처음 집과 마지막 집은 이웃이 아니다.

각 집을 빨강으로 칠할 때 드는 비용, 초록으로 칠할 때 드는 비용, 파랑으로 드는 비용이 주어질 때, 모든 집을 칠할 때 드는 비용의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 집의 수 N이 주어진다. N은 1,000보다 작거나 같다. 둘째 줄부터 N개의 줄에 각 집을 빨강으로 칠할 때, 초록으로 칠할 때, 파랑으로 칠할 때 드는 비용이 주어진다.

출력

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

예제 입력 

3
26 40 83
49 60 57
13 89 99

예제 출력 

96


[코드]


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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.util.Scanner;
 
public class Main {
 
    public static int color[][];
    public static int dp[][];
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        color = new int[N][3];
        dp = new int[N][3];
 
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < 3; j++) {
                color[i][j] = sc.nextInt();
                if (i == 0)
                    dp[i][j] = color[i][j];
            }
        }
 
        for (int i = 1; i < N; i++) {
            for (int j = 0; j < 3; j++) {
                for (int k = 0; k < 3; k++) {
                    if (j == k)
                        continue;
                    if (dp[i][j] == 0)
                        dp[i][j] = color[i][j] + dp[i - 1][k];
                    else
                        dp[i][j] = Math.min(dp[i][j], color[i][j]
                                + dp[i - 1][k]);
                }
            }
        }
 
        int min = dp[N - 1][0];
        for (int i = 0; i < 3; i++) {
            if (min > dp[N - 1][i])
                min = dp[N - 1][i];
        }
 
        System.out.println(min);
    }
}
cs


[알고리즘]


1. 이차원배열 color에는 각 집을 각 색깔로 칠하는 비용, dp 는 최소 비용을 저장하기 위해 만들었다.

2. dp[i][j]는 i 번째 집을 j 색으로 칠하는 최소 비용을 말한다. 

3. color[i][j] 에 이전 집까지의 최소비용 dp[i-1][k]와 더했을때 최소값을 dp[i][j]에 저장한다. 같은 색깔로 칠하면 안되니까, j와 k가 같을때는 고려하지 않는다.

4. 마지막으로 dp[N-1] 행에서 가장 최소값을 구해서 출력해준다.


'공부 > 알고리즘' 카테고리의 다른 글

백준1094_막대기  (0) 2016.11.29
백준1389_케빈 베이컨의 6단계 법칙  (0) 2016.11.23
백준11403_경로찾기  (1) 2016.11.18
백준1927_최소힙  (0) 2016.11.15
정렬 - 삽입, 퀵, 병합  (0) 2016.11.12

댓글