Algorithm
[BAEKJOON] 2839번 : 설탕 배달 (JAVA)
멍목
2022. 11. 6. 22:48
반응형
- 알고리즘 분류 : dp
- 사용 언어 : JAVA
소스 설명은 주석을 참고해주세요.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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());
int[][] dp = new int[N+1][2]; // 각 kg당 필요한 봉투의 갯수. (0: 3kg 봉투의 수, 1: 5kg 봉투의 수)
boolean[] isOk = new boolean[N+1]; // 3kg과 5kg 봉투를 이용해 운반할 수 있는 지 여부
if(N >= 3) {
isOk[3] = true;
dp[3][0] = 1;
dp[3][1] = 0;
}
if(N >= 5) {
isOk[5] = true;
dp[5][0] = 0;
dp[5][1] = 1;
}
// (현재무게-3) +1 OR (현재무게-5) +1
// 모두 가능한 경우 적은 무게를 선택.
for(int i=6; i<N+1; i++) {
if(isOk[i-3] && isOk[i-5]) {
if(dp[i-3][0] + dp[i-3][1] < dp[i-5][0] + dp[i-5][1]) {
dp[i][0] = dp[i-3][0] + 1;
dp[i][1] = dp[i-3][1];
}
else {
dp[i][0] = dp[i-5][0];
dp[i][1] = dp[i-5][1] + 1;
}
isOk[i] = true;
}
else if(isOk[i-3] & !isOk[i-5]) {
dp[i][0] = dp[i-3][0] + 1;
dp[i][1] = dp[i-3][1];
isOk[i] = true;
}
else if(!isOk[i-3] & isOk[i-5]) {
dp[i][0] = dp[i-5][0];
dp[i][1] = dp[i-5][1] + 1;
isOk[i] = true;
}
}
if(!isOk[N]) {
System.out.println(-1);
} else {
System.out.println(dp[N][0] + dp[N][1]);
}
}
}
반응형