-
백준 1149번 RGB거리 (JAVA)알고리즘(Algorithm)/다이나믹 프로그래밍(DP) 2022. 2. 12. 15:54
백준 1149번 RGB거리
https://www.acmicpc.net/problem/1149
1149번: RGB거리
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
문제
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보다 작거나 같은 자연수이다.
출력
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
소스 코드
- 동적 계획법 (DP)
- 탐색하지 않은 배열 처리가 중요
- dp 배열의 최초 값은 각 색상 비용의 첫 번째 값
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.StringTokenizer; public class Main { static int N; final static int R = 0; final static int G = 1; final static int B = 2; static int[][] cost, dp; public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st; N = Integer.parseInt(br.readLine()); cost = new int[N][3]; dp = new int[N][3]; for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); cost[i][R] = Integer.parseInt(st.nextToken()); cost[i][G] = Integer.parseInt(st.nextToken()); cost[i][B] = Integer.parseInt(st.nextToken()); } //dp 배열 초기화 : 최초 값은 각 색상비용 첫 번째 값 dp[0][R] = cost[0][R]; dp[0][G] = cost[0][G]; dp[0][B] = cost[0][B]; bw.write(Math.min(paintCost(N-1,R), Math.min(paintCost(N-1, G), paintCost(N-1, B))) + "\n"); bw.flush(); bw.close(); br.close(); } private static int paintCost(int n, int color) { //탐색하지 않은 배열 if(dp[n][color] == 0) { if(color == R) dp[n][R] = Math.min(paintCost(n-1, G), paintCost(n-1, B)) + cost[n][R]; if(color == G) dp[n][G] = Math.min(paintCost(n-1, R), paintCost(n-1, B)) + cost[n][G]; if(color == B) dp[n][B] = Math.min(paintCost(n-1, R), paintCost(n-1, G)) + cost[n][B]; } return dp[n][color]; } }
'알고리즘(Algorithm) > 다이나믹 프로그래밍(DP)' 카테고리의 다른 글
백준 1904번 01타일 (JAVA) (0) 2022.02.12 백준 9641번 파도반 수열 (JAVA) (0) 2022.02.12 백준 2748번 피보나치 수 2 (JAVA) (0) 2022.02.12 백준 2698번 인접한 비트의 개수 (JAVA) (0) 2021.05.27 백준 1003번 피보나치 함수 (JAVA) (0) 2021.05.27