프로그래밍 공방

[백준] 1149번 : RGB 거리 본문

개발/문제해결

[백준] 1149번 : RGB 거리

hyosupsong 2020. 11. 3. 20:45

문제

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보다 작거나 같은 자연수이다.


출력

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


문제해결방법

1번 집부터 N번 집까지 순서대로 칠한다고 가정해보자.

1번집은 왼쪽에 집이 없으므로 각각의 색으로 칠할 때 R1,G1,B1의 비용이 든다.

2번집 부터는 집을 각각의 색으로 칠할 때 왼쪽 집의 색에 대한 조건이 붙는다.

예를 들면, 2번 집에 빨간색을 칠하기 위해서는 1번 집이 파란 색이거나 초록색이어야 한다.

이를 식으로 나타내면, 아래와 같이 나타낼 수 있다.

2번 집에 빨간색을 칠하는 비용 = (G1 + R2) or (B1 or R2)

이 중 최소 비용을 선택해야 하므로 Min(G1, B1) + R2 가 된다.

위 과정을 N번 집까지 반복하면 모든 집을 칠하는 경우에서 최소 비용을 구할 수 있다.


POINT

N번째 집이 각각의 색깔(R,G,B)로 칠해질 때 최소 비용을 만드는 일반항을 구해라.


코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package baekjoon;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main1149_RGB거리 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int N = Integer.parseInt(br.readLine());
        int[][] RGB = new int[N][3];
        for(int i=0; i<N; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<3; j++) RGB[i][j] = Integer.parseInt(st.nextToken());
        }
        for(int i=1; i<N; i++) {
            RGB[i][0+= Math.min(RGB[i-1][1], RGB[i-1][2]);
            RGB[i][1+= Math.min(RGB[i-1][0], RGB[i-1][2]);
            RGB[i][2+= Math.min(RGB[i-1][0], RGB[i-1][1]);
        }
        System.out.println(Math.min(RGB[N-1][0], Math.min(RGB[N-1][1], RGB[N-1][2])));
    }
}
cs

코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.