- 난이도: Lv2
프로그래머스 링크: https://school.programmers.co.kr/learn/courses/30/lessons/389480
풀이 링크(GitHub): hayannn/CodingTest_Java/프로그래머스/2/완전범죄
풀이 시간 : 23분
dp[i][j] = i
번째 물건까지 처리 -> B의 흔적 총합이 j인 상황에서 A 흔적 총합의 최솟값 구하기dp[i][j] = Math.min(dp[i][j], dp[i-1][j] + a)
dp[i][j + b] = Math.min(dp[i][j + b], dp[i-1][j])
dp[size][j]
의 최솟값을 찾아서 n 이상이면 -1 반환, 그렇지 않으면 최솟값 자체를 반환import java.util.*;
class Solution {
static final int INF = 100000;
public int solution(int[][] info, int n, int m) {
int size = info.length;
int[][] dp = new int[size + 1][m];
for (int i = 0; i <= size; i++) {
Arrays.fill(dp[i], INF);
}
dp[0][0] = 0;
for (int i = 1; i <= size; i++) {
int a = info[i-1][0]; // A 흔적
int b = info[i-1][1]; // B 흔적
for (int j = 0; j < m; j++) {
// A가 선택
dp[i][j] = Math.min(dp[i][j], dp[i-1][j] + a);
// B가 선택
if (j + b < m) {
dp[i][j + b] = Math.min(dp[i][j + b], dp[i-1][j]);
}
}
}
int min = INF;
for (int j = 0; j < m; j++) {
min = Math.min(dp[size][j], min);
}
return min >= n ? -1 : min;
}
}
import java.util.*;
class Solution {
public int solution(int[][] info, int n, int m) {
int thingCount = info.length;
int[] dp = new int[m];
// 모든 물건을 A가 훔쳤을 때 총 흔적 개수
int maxATrace = 0;
for (int i = 0; i < thingCount; i++) {
maxATrace += info[i][0];
}
// 배낭 DP: B의 가중치로 접근하면서 A의 절약값 최대치 구하기
for (int i = 0; i < thingCount; i++) {
int aTrace = info[i][0];
int bTrace = info[i][1];
for (int j = m - 1; j >= bTrace; j--) {
dp[j] = Math.max(dp[j], dp[j - bTrace] + aTrace);
}
}
int answer = maxATrace - dp[m - 1];
return answer >= n ? -1 : answer;
}
}