코딩문제풀이/Baekjoon
[Java] 백준 17404번 : RGB거리 2
코딩하는 포메라니안
2022. 3. 27. 14:28
1. 문제
https://www.acmicpc.net/problem/17404
17404번: RGB거리 2
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
2. 풀이 과정
1 => N번째 집을 차례대로 색을 칠한다. 각자 자신의 앞의 집의 색깔만 피하면 된다.
단, 마지막 집은 첫 번째 집의 색깔도 고려해야하기 때문에 처음부터 첫 번째 집의 색에 따라 나눠 계산했다.
첫 번째 집 색에 따라 R[], G[], B[]를 만들어서 값을 업데이트해갔다. 이는 Dynamic Programming을 사용한 풀이 방법이라 볼 수 있다.
예를 들어 R[]에서 현재 집의 색을 Red로 칠할 경우, 이 전의 집을 Green으로 칠했을 때인 R[1]과 Blue로 칠했을 때인 R[2] 중 더 작은 값을 선택해서 현재 집을 Red로 칠할 때 값을 더해서 업데이트한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void update(int[] arr, int[] price) {
int n1 = Math.min(arr[1], arr[2]);
int n2 = Math.min(arr[0], arr[2]);
arr[2] = Math.min(arr[0], arr[1])+price[2];
arr[0] = n1+price[0];
arr[1] = n2+price[1];
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
final int INF = 999_999_999;
int n = Integer.parseInt(br.readLine());
int R[] = new int[3], G[] = new int[3], B[] = new int[3];
//초기 세팅
st = new StringTokenizer(br.readLine());
R[0] = Integer.parseInt(st.nextToken());
G[1] = Integer.parseInt(st.nextToken());
B[2] = Integer.parseInt(st.nextToken());
R[1] = R[2] = G[0] = G[2] = B[0] = B[1] = INF;
//값 읽어들이면서 update
int price[];
for(int i=1;i<n;i++) {
st = new StringTokenizer(br.readLine());
price = new int[] {Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())};
update(R, price);
update(G, price);
update(B, price);
}
System.out.println(Math.min(Math.min(Math.min(R[1], R[2]), Math.min(G[0], G[2])), Math.min(B[0], B[1])));
}
}