코딩테스트/백준

[Java] 백준 1149 : RGB거리

플래시🦥 2023. 2. 1.

목차

반응형

https://www.acmicpc.net/problem/1149

 

1149번: RGB거리

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

www.acmicpc.net


모든 집을 칠하는 최솟값을 구해야 한다. 규칙은 아래와 같다. 

[Java] 백준 1149 : RGB거리

현재 칠할 집의 색은 앞에 칠해진 집의 색과 다르면 된다. 

 

1. RGB 값을 각각 저장한 다음 dp[][]에 이전에 칠해진 색상을 제외한 비용 중 최솟값을 구한다. 

2. dp[]에 누적 비용을 저장한다.

 

dp[i][0]=Math.min(dp[i-1][1],dp[i-1][2])+R;
dp[i][1]=Math.min(dp[i-1][0],dp[i-1][2])+G;
dp[i][2]=Math.min(dp[i-1][0],dp[i-1][1])+B;

dp[i][0]은 현재 집을 빨간색으로 칠할 때의 누적비용을 의미한다.

현재 집을 빨간색으로 칠하려면 이전 집은 초록색이나 파란색이어야 한다.

그래서 dp[i-1][1] 과 dp[i-1][2]  즉, 빨강을 제외한  초록과 파란색을 칠했을 때의 비용을 비교해 현재 집을 빨간색을 칠했을 때의 비용을 더해서 저장한다. 

각각 색상별로 저장을 해준다음 마지막에 dp[N]의 누적금액을 비교해서 출력하면 된다. 

 

import java.io.*;
import java.util.*;

public class Main {
	
	static int N;
	static int[][] dp;
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N =Integer.parseInt(br.readLine());
				
		dp = new int [N+1][3];
		
		for(int i=1;i<=N;i++) {
			String[] s = br.readLine().split(" ");
			int R=Integer.parseInt(s[0]);
			int G=Integer.parseInt(s[1]);
			int B=Integer.parseInt(s[2]);
						
			dp[i][0]=Math.min(dp[i-1][1],dp[i-1][2])+R;
			dp[i][1]=Math.min(dp[i-1][0],dp[i-1][2])+G;
			dp[i][2]=Math.min(dp[i-1][0],dp[i-1][1])+B;
		}
		
		
		System.out.println(Math.min(dp[N][0], Math.min(dp[N][1],dp[N][2])));
		br.close(); 
		 
	}// main()
	
}// class Main
728x90
반응형

댓글