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

Solution
dp 문제인데 삽질을 했다... 아래와 같이 간단히 생각하면 금방 점화식을 도출할 수 있다
| R | G | B | |
| house[0] | house[0][0] | house[0][1] | house[0][2] | 
| house[1] | Math.min(house[0][1], house[0][2]) + house[1][0] | Math.min(house[0][0], house[0][2]) + house[1][1] | Math.min(house[0][0], house[0][1]) + house[1][2] | 
| house[2] | Math.min(house[1][1], house[1][2]) + house[2][0] | Math.min(house[1][0], house[1][2]) + house[2][1] | Math.min(house[1][0], house[1][1]) + house[2][2] | 
| ... | ... | ... | ... | 
| house[n] | Math.min(house[n-1][1], house[n-1][2]) + house[n][0] | Math.min(house[n-1][0], house[n-1][2]) + house[n][1] | Math.min(house[n-1][0], house[n-1][1]) + house[n][2] | 
house[n][0] 은 n+1 번째 집을 빨강으로 칠하려고 할 경우 지금까지 드는 비용의 누적이다. 직전 행(n-1)에서 빨간칠을 하지 않았을 경우의 비용들 중에서 최솟값을 골라 가져오기 때문에 주어진 규칙을 충족한다.
import java.util.*;
import java.io.*;
class Solution
{
	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[][] house=new int[N][3];
		for(int i=0;i<N;i++) {
			st=new StringTokenizer(br.readLine()," ");
			house[i][0]=Integer.parseInt(st.nextToken());
			house[i][1]=Integer.parseInt(st.nextToken());
			house[i][2]=Integer.parseInt(st.nextToken());
		}
		
		for(int i=1;i<N;i++) {
			house[i][0]+=Math.min(house[i-1][1], house[i-1][2]);
			house[i][1]+=Math.min(house[i-1][0], house[i-1][2]);
			house[i][2]+=Math.min(house[i-1][0], house[i-1][1]);
		}
		int answer=Math.min(house[N-1][0], house[N-1][1]);
		answer=Math.min(answer, house[N-1][2]);
		System.out.print(answer);
	}
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
| [백준] 1956 : 운동 (JAVA), 플로이드-와샬(Floyd-Warshall) (0) | 2023.01.18 | 
|---|---|
| [백준] 1080 : 행렬 (JAVA) (0) | 2022.07.28 | 
| [백준] 9663 : N-Queen (JAVA) (0) | 2022.07.28 | 
| [백준] 3273 : 두 수의 합 (JAVA) (0) | 2022.07.28 | 
| [백준] 11053 : 가장 긴 증가하는 부분 수열 / LIS (JAVA) (0) | 2022.07.28 | 
										
									
										
									
										
									
										
									
댓글