반응형
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
// N개의 집과 해당 집의 도배에 필요한 각각의 비용을 넣는 변수
int[][] arr = new int[N][3];
for(int i=0; i<N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j=0; j<3; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
// 비용을 저장해두는 변수
int[][] cost = new int[N][3];
cost[0][0] = arr[0][0];
cost[0][1] = arr[0][1];
cost[0][2] = arr[0][2];
// 비용 계산
// 점화식 (0:R색, 1:G색, 2:B색)
// N번째 집을 R색으로 칠한 경우 cost[i][0] = min(cost[i][1], cost[i][2]) + arr[i][0]
// N번째 집을 G색으로 칠한 경우 cost[i][1] = min(cost[i][0], cost[i][2]) + arr[i][1]
// N번째 집을 B색으로 칠한 경우 cost[i][2] = min(cost[i][1], cost[i][0]) + arr[i][2]
for(int i=1;i<N;i++) {
cost[i][0] = Math.min(cost[i-1][1], cost[i-1][2]) + arr[i][0];
cost[i][1] = Math.min(cost[i-1][0], cost[i-1][2]) + arr[i][1];
cost[i][2] = Math.min(cost[i-1][0], cost[i-1][1]) + arr[i][2];
}
// 마지막에 N번 째 집을 RGB 로 도배한 비용 중에 가장 작은 값을 반환한다.
int result = Math.min(cost[N-1][0], Math.min(cost[N-1][1], cost[N-1][2]));
System.out.println(result);
}
}
이번 문제는 다이나믹 프로그래밍을 이용해서 해결하였습니다.
A B C 라는 집이 있다고 가정하였을 때, A는 B와 같은색이면 안 되고, B는 A와 C와 같은 색이면 안 되고, C는 B와 같은 색이면 안 되는 규칙을 가지고 있습니다.
즉, ( 이전 집까지의 도색 비용 + R색 / 이전 집까지의 도색 비용 + G색 / 이전 집까지의 도색 비용 + B색 ) 중 최소값을 출력하면 되는 문제입니다.
소스 설명은 주석을 참고해주세요.
좋은 지적과 지식 공유는 언제나 환영합니다^^
반응형
'Algorithm' 카테고리의 다른 글
[BAEKJOON] 2579번 : 계단오르기 (JAVA) (0) | 2022.01.28 |
---|---|
[BAEKJOON] 2156번 : 포도주시식 (JAVA) (0) | 2022.01.27 |
[BAEKJOON] 9095번 : 1, 2, 3 더하기 (0) | 2022.01.24 |
[이것이 코딩테스트다] 7. 다이나믹 프로그래밍 - 실전 문제 풀이 (0) | 2022.01.23 |
[BAEKJOON] 1193번 : 분수찾기 (0) | 2022.01.22 |