Algorithm/BOJ
BOJ_17404_RGB거리 2_java
owoowo
2023. 1. 24. 12:29
728x90
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.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/**
백준 17404번 RGB거리 2
골드 4
*/
public class BOJ_17404_RGB거리2 {
private static final int INF = 123456789;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int[][] map = new int[N][3];
for (int i = 0 ; i< N; i++){
st = new StringTokenizer(br.readLine());
for (int j = 0; j<3; j++){ // R, G, B 순서 비용
map[i][j] = Integer.parseInt(st.nextToken());
}
}
System.out.println(solve(N, map));
}
public static long solve(int N, int map[][]){
long[][] dp = new long[N][3];
long min = INF;
for (int i = 0; i<3; i++){ // 0번 집 색상
for (int j = 0; j<N; j++){
if (j==0){
if (i == 0){ // 처음 집 r
dp[0][0] = map[0][0];
dp[0][1] = INF; //다른 집 선택 안하도록
dp[0][2] = INF;
}else if(i == 1){ // 처음 집 g
dp[0][0] = INF;
dp[0][1] = map[0][1];
dp[0][2] = INF;
}else if(i==2){ // 처음 집 b
dp[0][0] = INF;
dp[0][1] = INF;
dp[0][2] = map[0][2];
}
}else{
dp[j][0] = Math.min(dp[j-1][1], dp[j-1][2]) + map[j][0];
dp[j][1] = Math.min(dp[j-1][0], dp[j-1][2]) + map[j][1];
dp[j][2] = Math.min(dp[j-1][0], dp[j-1][1]) + map[j][2];
}
}
if (i == 0){ // 처음 집 r
min = Math.min(min, Math.min(dp[N-1][1], dp[N-1][2]));
}else if(i == 1){ // 처음 집 g
min = Math.min(min, Math.min(dp[N-1][0], dp[N-1][2]));
}else if(i==2){ // 처음 집 b
min = Math.min(min, Math.min(dp[N-1][0], dp[N-1][1]));
}
}
return min;
}
public static void printmap(int[][] map){ // 입력 테스트
System.out.println();
for (int i = 0; i<map.length; i++){
for (int j = 0; j<map[i].length; j++){
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
public static void printmap(long[][] map){ // 입력 테스트
System.out.println();
for (int i = 0; i<map.length; i++){
for (int j = 0; j<map[i].length; j++){
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
}