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

[백준 17404] RGB거리2(JAVA)

by 소보루:-) 2020. 4. 4.

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

 

17404번: RGB거리 2

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

www.acmicpc.net

 

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	static int N;
	static int[][] cost;
	static int[][] dp;
	public static void main(String[] args) throws Exception{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		N=Integer.parseInt(br.readLine());
		cost=new int[N+1][3];
		dp=new int[N+1][3];
		for(int i=1; i<=N; i++) {
			st=new StringTokenizer(br.readLine()," ");
			for(int j=0; j<3; j++) {
				cost[i][j]=Integer.parseInt(st.nextToken());
			}
		}
		
		int min=98765432;
		
		int total=cost[1][0]+cost[1][1]+cost[1][2];
		dp[1][0]=cost[1][0];//1번집 R일때
		dp[1][1]=total;
		dp[1][2]=total;
		for(int i=2; i<N; i++) {
			dp[i][0]=Math.min(dp[i-1][1]+cost[i][0],dp[i-1][2]+cost[i][0]);
			dp[i][1]=Math.min(dp[i-1][0]+cost[i][1],dp[i-1][2]+cost[i][1]);
			dp[i][2]=Math.min(dp[i-1][0]+cost[i][2],dp[i-1][1]+cost[i][2]);
		}
		dp[N][1]=Math.min(dp[N-1][0]+cost[N][1],dp[N-1][2]+cost[N][1]);
		dp[N][2]=Math.min(dp[N-1][0]+cost[N][2],dp[N-1][1]+cost[N][2]);
		if(min>Math.min(dp[N][1], dp[N][2])) {
			min = Math.min(dp[N][1], dp[N][2]);
		}
		dp[1][0]=total;//1번집 G일때
		dp[1][1]=cost[1][1];
		dp[1][2]=total;
		
		for(int i=2; i<N; i++) {
			dp[i][0]=Math.min(dp[i-1][1]+cost[i][0],dp[i-1][2]+cost[i][0]);
			dp[i][1]=Math.min(dp[i-1][0]+cost[i][1],dp[i-1][2]+cost[i][1]);
			dp[i][2]=Math.min(dp[i-1][0]+cost[i][2],dp[i-1][1]+cost[i][2]);
		}
		dp[N][0]=Math.min(dp[N-1][1]+cost[N][0],dp[N-1][2]+cost[N][0]);
		dp[N][2]=Math.min(dp[N-1][0]+cost[N][2],dp[N-1][1]+cost[N][2]);
		if(min>Math.min(dp[N][0], dp[N][2])) {
			min = Math.min(dp[N][0], dp[N][2]);
		}
		
		dp[1][0]=total;
		dp[1][1]=total;
		dp[1][2]=cost[1][2];//1번집 B일때
		for(int i=2; i<N; i++) {
			dp[i][0]=Math.min(dp[i-1][1]+cost[i][0],dp[i-1][2]+cost[i][0]);
			dp[i][1]=Math.min(dp[i-1][0]+cost[i][1],dp[i-1][2]+cost[i][1]);
			dp[i][2]=Math.min(dp[i-1][0]+cost[i][2],dp[i-1][1]+cost[i][2]);
		}
		dp[N][0]=Math.min(dp[N-1][1]+cost[N][0],dp[N-1][2]+cost[N][0]);
		dp[N][1]=Math.min(dp[N-1][0]+cost[N][1],dp[N-1][2]+cost[N][1]);
		if(min>Math.min(dp[N][0], dp[N][1])) {
			min = Math.min(dp[N][0], dp[N][1]);
		}
		System.out.println(min);
	}

}

댓글