RGB거리 1를 먼저 풀어보는 걸 권장합니다.
처음과 끝이 인접해 있다
는 차이밖에 없습니다.해당 문제는 N번째 값을 선택할 때 지금까지 만든 최솟값의 출발이 어디였는지
에 대한 정보가 필요합니다. 처음에는 출발값을 담은 객체를 만들어 문제를 해결하려 했지만 풀리지 않았습니다.
import java.util.*;
import java.io.*;
import java.math.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[][] board = new int[N][3];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < 3; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
int minVal = Integer.MAX_VALUE;
for (int t = 0; t < 3; t++) {
int[][] dp = new int[N][3];
for (int k = 0; k < 3; k++) {
if(k == t) {
dp[0][k] = board[0][k];
}else {
dp[0][k] = 1001;
}
}
for (int i = 1; i < N-1; i++) {
dp[i][0] = Math.min(dp[i-1][1], dp[i-1][2]) + board[i][0];
dp[i][1] = Math.min(dp[i-1][0], dp[i-1][2]) + board[i][1];
dp[i][2] = Math.min(dp[i-1][0], dp[i-1][1]) + board[i][2];
}
// 마지막 값 처리
if(t == 0) {
dp[N-1][0] = Integer.MAX_VALUE;
dp[N-1][1] = Math.min(dp[N-2][0], dp[N-2][2]) + board[N-1][1];
dp[N-1][2] = Math.min(dp[N-2][0], dp[N-2][1]) + board[N-1][2];
}else if (t == 1){
dp[N-1][1] = Integer.MAX_VALUE;
dp[N-1][0] = Math.min(dp[N-2][1], dp[N-2][2]) + board[N-1][0];
dp[N-1][2] = Math.min(dp[N-2][0], dp[N-2][1]) + board[N-1][2];
}else if(t == 2) {
dp[N-1][2] = Integer.MAX_VALUE;
dp[N-1][0] = Math.min(dp[N-2][1], dp[N-2][2]) + board[N-1][0];
dp[N-1][1] = Math.min(dp[N-2][0], dp[N-2][2]) + board[N-1][1];
}
int answer = Math.min(Math.min(dp[N-1][0], dp[N-1][1]),dp[N-1][2]);
// for (int i = 0; i < dp.length; i++) {
// System.out.println(Arrays.toString(dp[i]));
// }
minVal = Math.min(minVal, answer);
}
System.out.println(minVal);
}
}