알고리즘/백준

백준-1149번/RGB거리 (java)

연향동큰손 2024. 2. 22. 21:08

우선 각각의 집의 RGB 비용을 저장 할 이차원 배열 RGB[n][3]을 만들어준다.

그리고  RGB와 크기가 같은 이차원 배열 dp[n][3]을 만들어준다.

 

 

dp문제는 조건에 따른 경우의 수를 누적해 오면서 맨 마지막 경우에 따른 뒤의 경우를 생각해봐야 한다.

 

3
26 40 83
49 60 57
13 89 99

이렇게 3개의 집이 있다고 생각해보자.

 

맨 마지막 집이 빨간색인 경우 ==> 이 전 집은 파랑OR초록이 왔을때의 최솟값

맨 마지막 집이 파란색인 경우 ==> 이 전 집은 빨강OR초록이 왔을때의 최솟값

맨 마지막 집이 초록색인 경우 ==> 이 전 집은 빨강OR파랑이 왔을때의 최솟값

 

이 때 전전 집(dp[n-2][?])을 생각하지 않아도 되는 이유 : 전전 집도 위 식과 똑같은 방식으로 앞 뒤 집과 똑같은 색을 피해 가는 경우이다.

 

이렇게 만든 점화식은 다음과 같다.

		dp[0][0]=RGB[0][0];
		dp[0][1]=RGB[0][1];
		dp[0][2]=RGB[0][2];
		
		for(int i=1; i<n; i++) {
			dp[i][0]=Math.min(dp[i-1][1],dp[i-1][2])+RGB[i][0];
			dp[i][1]=Math.min(dp[i-1][0],dp[i-1][2])+RGB[i][1];
			dp[i][2]=Math.min(dp[i-1][1],dp[i-1][0])+RGB[i][2];
			
		}

 

 

최소 비용을 구할때는 마지막 집이 R인 경우, G인 경우, B인 경우의 최솟값을 구해주면 된다. 

int min=dp[n-1][0];
		for(int i=0; i<3; i++) {
			if(min>dp[n-1][i]) {
				min=dp[n-1][i];
			}
		}

 

 

정답 코드

import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n=scanner.nextInt();
		int [][] RGB = new int[n][3];
		for(int i=0; i<n; i++) {
			for(int j=0; j<3; j++) {
			RGB[i][j]=scanner.nextInt();
			}
		}
		
		int[][] dp = new int[n][3];
		
		dp[0][0]=RGB[0][0];
		dp[0][1]=RGB[0][1];
		dp[0][2]=RGB[0][2];
		
		for(int i=1; i<n; i++) {
			dp[i][0]=Math.min(dp[i-1][1],dp[i-1][2])+RGB[i][0];
			dp[i][1]=Math.min(dp[i-1][0],dp[i-1][2])+RGB[i][1];
			dp[i][2]=Math.min(dp[i-1][1],dp[i-1][0])+RGB[i][2];
			
		}
		int min=dp[n-1][0];
		for(int i=0; i<3; i++) {
			if(min>dp[n-1][i]) {
				min=dp[n-1][i];
			}
		}
		
		System.out.println(min);
		
	}
}

'알고리즘 > 백준' 카테고리의 다른 글

백준-11057번/오르막 수 (java)  (0) 2024.02.23
백준-1309번/동물원 (java)  (1) 2024.02.23
백준-2225번/합분해 (java)  (1) 2024.02.20
백준-1699번/제곱수의 합 (java)  (0) 2024.02.19
백준-1912번/연속합 (java)  (0) 2024.02.19