Algorithm, boj, 1149(RGB거리), dp
DP(다이나믹 프로그래밍)
- 주어진 문제를 여러 개의 부분문제들로 나누어 푼 다음, 그 결과들로 주어진 문제를 푼다
- dp는 겹치는 문제가 발생하기 때문에 메모제이션 등이 필요하다
해결하지 못한 원인
- 누적된 결과로 해결하는 것이기때문에 누적된것은 항상 최선이여야 한다.
- 해결 이론은 탑다운, 구현은 바텀업
내 코드
package org.baekjoon;
import java.util.Scanner;
public class test1149 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] list = new int[n][3];
int[][] result = new int[n][3];
int min = 0;
for (int i=0; i<n; i++) {
for (int j=0; j<3; j++)
list[i][j] = sc.nextInt();
}
if(n == 1) {
min = findMin(list[0][0], list[0][1], list[0][2]);
}
else {
result[0][0] = Math.min(list[0][1], list[0][2]) + list[1][0];
result[0][1] = Math.min(list[0][0], list[0][2]) + list[1][1];
result[0][2] = Math.min(list[0][0], list[0][1]) + list[1][2];
if (n>2) {
for (int i=1; i<n-1; i++) {
result[i][0] = Math.min(result[i-1][1], result[i-1][2]) + list[i+1][0];
result[i][1] = Math.min(result[i-1][0], result[i-1][2]) + list[i+1][1];
result[i][2] = Math.min(result[i-1][0], result[i-1][1]) + list[i+1][2];
}
}
min = findMin(result[n-2][0],result[n-2][1],result[n-2][2]);
}
System.out.println(min);
}
static int findMin(int a, int b, int c) {
int min = a;
if( a > b) {
if (b > c)
min = c;
else
min = b;
}
else {
if (a > c)
min = c;
}
return min;
}
}
다른 분의 코드
public class BOJ1149 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int[][] cost = new int[3][N];
int r, g, b;
cost[0][0] = scanner.nextInt();
cost[1][0] = scanner.nextInt();
cost[2][0] = scanner.nextInt();
for(int i = 1; i < N; i++) {
r = scanner.nextInt();
g = scanner.nextInt();
b = scanner.nextInt();
cost[0][i] = r + Math.min(cost[1][i-1], cost[2][i-1]);
cost[1][i] = g + Math.min(cost[0][i-1], cost[2][i-1]);
cost[2][i] = b + Math.min(cost[0][i-1], cost[1][i-1]);
}
System.out.println(Math.min(cost[0][N-1], Math.min(cost[1][N-1], cost[2][N-1])));
scanner.close();
}
}
Reference
문제바로가기
문제풀이