본문 바로가기
알고리즘/문제 풀이

[백준] 1149 : RGB거리 (JAVA)

by 민죠미 2022. 7. 28.
 

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);
	}
}

 

댓글