1. 문제설명
상근이는 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕을 담는 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다. 최대한 적은 봉지를 들고 가려고 한다.
- 시간 제한: 1초
- 메모리 제한: 128MB
2. 접근 방식
- `dp[i]`를 설탕 무게가 `i`일 때 필요한 최소 봉지 개수를 저장한다.
- `dp[1] ~ dp[5]` 에 초기값을 설정한다.
- `i=6` 부터는 `dp[i-3]`과 `dp[i-5]`의 값을 고려하여 계산한다.
- 한 쪽만 0이 아닌 경우: 0이 아닌 값 + 1
- 두 쪽 모두 0이 아닌 경우: `Math.min(dp[i-3], dp[i-5]) + 1`
- 모두 0인 경우: 0으로 설정
- 최종적으로 `dp[n]`이 0이면 -1을 출력, 아니면 dp[n]값을 출력한다.
3. 최종 코드
import java.io.*;
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[5001]; // 최소 봉지 개수 저장
dp[1] = 0; dp[2] = 0; dp[4] = 0; // 1,2,4는 0으로 초기화
dp[3] = 1; dp[5] = 1; // 3,5는 1로 초기화
// 6부터 n까지 dp값 계산
for(int i=6; i<=n; i++) {
// 3kg 봉지로 만들 수 없고 5kg 봉지로 만들 수 있는 경우
if(dp[i-3]==0 && dp[i-5]!=0)
dp[i] = dp[i-5] + 1;
// 3kg 봉지로 만들 수 있고 5kg 봉지로 만들 수 없는 경우
else if(dp[i-3]!=0 && dp[i-5]==0)
dp[i] = dp[i-3] + 1;
// 3kg과 5kg 봉지 모두 사용 가능한 경우
else if(dp[i-3]!=0 && dp[i-5]!=0)
// 최소 개수를 선택
dp[i] = Math.min(dp[i-3], dp[i-5]) + 1;
// 어떤 경우에도 만들 수 없는 경우
else dp[i] = 0;
}
// n에 해당하는 dp 값이 0이라면 -1 출력 (불가능)
if(dp[n] == 0) System.out.println(-1);
else System.out.println(dp[n]);
}
}
반응형
'알고리즘 문제 > 백준' 카테고리의 다른 글
[백준] 가장 긴 짝수 연속한 부분 수열 (small) (Java) (0) | 2024.08.28 |
---|---|
[백준] 1463번: 1로 만들기 (Java) (1) | 2024.08.28 |
[백준] 11727번: 2xn 타일링 2 (Java) (0) | 2024.08.27 |
[백준] 9655번: 돌 게임 (Java) (0) | 2024.08.27 |
[백준] 9095번: 1,2,3 더하기 (Java) (0) | 2024.08.26 |
댓글