PS
[백준] 1149번 : RGB거리[Java]
devkdh
2025. 7. 22. 15:13

#풀이
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st;
int[][] dp = new int[N+1][4]; //1:R 2:G 3:B
for(int[] arr:dp){
Arrays.fill(arr,Integer.MAX_VALUE);
}
dp[0][1] = 0;
dp[0][2] = 0;
dp[0][3] = 0;
for(int i = 1; i<=N; i++){
st = new StringTokenizer(br.readLine());
for(int j = 1; j<=3; j++){
if(j==2)dp[i][j] = Math.min(dp[i-1][j-1],dp[i-1][j+1])+Integer.parseInt(st.nextToken());
else if(j==1)dp[i][j] = Math.min(dp[i-1][j+1],dp[i-1][j+2])+Integer.parseInt(st.nextToken());
else dp[i][j] = Math.min(dp[i-1][j-1],dp[i-1][j-2])+Integer.parseInt(st.nextToken());
}
}
System.out.println(Arrays.stream(dp[N]).min().getAsInt());
}
}
#성능

#정리
dp문제이다.
dp의 점화식은 다음과 같다.
1번 색(빨강)으로 칠할 경우-> dp[i][1] = min(dp[i-1][2], dp[i-1][3]) + 현재 집의 빨강 비용
2번 색(초록)으로 칠할 경우-> dp[i][2] = min(dp[i-1][1], dp[i-1][3]) + 현재 집의 초록 비용
3번 색(파랑)으로 칠할 경우-> dp[i][3] = min(dp[i-1][1], dp[i-1][2]) + 현재 집의 파랑 비용
색이 3가지라 반복문 없이 하드코딩했다.