반응형
https://www.acmicpc.net/problem/1149
1149번: RGB거리
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
모든 집을 칠하는 최솟값을 구해야 한다. 규칙은 아래와 같다.
현재 칠할 집의 색은 앞에 칠해진 집의 색과 다르면 된다.
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
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
[Java] 백준 1697 : 숨바꼭질 (0) | 2023.02.02 |
---|---|
[Java] 백준 1931 : 회의실 배정 (0) | 2023.02.02 |
백준 2667 : 단지번호붙이기 _자바 Java (0) | 2023.02.01 |
백준 2178 : 미로 탐색 _자바 Java (0) | 2023.01.31 |
백준 1406 : 에디터 _자바 Java (0) | 2023.01.31 |
댓글