알고리즘 문제풀이/백준
[백준 1149] RGB거리
선서니
2023. 3. 28. 13:38
1149번: RGB거리
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
풀이
현재 집이 옆집의 색과 같으면 안된다는 규칙이 있어서 각 집을 RGB색으로 각각 칠했을 때의 비용을 모두 저장해서 비교를 했다
규칙 찾기
- 현재 집이 이전 집과 색이 다르다면 집을 칠하는 규칙을 만족하기 때문에 이전 집, 다음 집 모두가 아니라 이전 집과만 색 비교를 해도 가능
- 현재 집이 R색을 칠했다면, 이전 집은 G,B색 중 최솟값을 칠한 비용 + 현재 집이 R색을 칠했을 때 비용
- 현재 집이 G색을 칠했다면, 이전 집은 R,B색 중 최솟값을 칠한 비용 + 현재 집이 G색을 칠했을 때 비용
- 현재 집이 B색을 칠했다면, 이전 집은 R,G색 중 최솟값을 칠한 비용 + 현재 집이 B색을 칠했을 때 비용
전체 코드
package Day_0328;
import java.io.*;
import java.util.*;
public class Main_bj_1149_RGB거리_서울_20반_김선희 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
// 각 색을 칠하는데 필요한 비용 - 0:R, 1:G, 2:B
int[][] cost = new int[N+1][3];
for(int i=1; i<=N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
cost[i][0] = Integer.parseInt(st.nextToken());
cost[i][1] = Integer.parseInt(st.nextToken());
cost[i][2] = Integer.parseInt(st.nextToken());
}
// n번째 집까지 각 색으로 칠하는 비용
// 0 : n번째 집을 R색으로 칠할 때 비용
// 1 : n번째 집을 G색으로 칠할 때 비용
// 2 : n번째 집을 B색으로 칠할 때 비용
int[][] dp = new int[N+1][3];
dp[1] = cost[1];
for(int i=2; i<=N; i++) {
//i번째 집을 R색으로 칠하기 때문에 i-1번째는 R색이 아니어야 함 >> G,B색으로 칠한 것 중 최소값
dp[i][0] = Math.min(dp[i-1][1], dp[i-1][2]) + cost[i][0];
//i번째 집을 G색으로 칠하기 때문에 i-1번째는 G색이 아니어야 함 >> R,B색으로 칠한 것 중 최소값
dp[i][1] = Math.min(dp[i-1][0], dp[i-1][2]) + cost[i][1];
//i번째 집을 B색으로 칠하기 때문에 i-1번째는 B색이 아니어야 함 >> R,G색으로 칠한 것 중 최소값
dp[i][2] = Math.min(dp[i-1][0], dp[i-1][1]) + cost[i][2];
}
// n번째 집을 RGB색으로 각각 칠했을 때 중 최솟값 찾기
System.out.println(Math.min(dp[N][0], Math.min(dp[N][1], dp[N][2])));
br.close();
}
}