2839번 문제는 대표적인 다이나믹 프로그래밍(DP) 문제라고 할 수 있겠습니다
다이나믹 프로그래밍이란 이전에 풀어던 값을 한번 쓰고 버리는 것이 아닌 값을 저장하였다가 이후 값을 찾아내는데 있어서 또 사용하는 방식의 프로그래밍 방식입니다. 2839번 설탕 배달 문제도 마찬가지입니다.
문제 조건
- 봉지는 3kg 와 5kg 의 설탕을 담을 수 있는 봉지가 존재합니다.
- 최소한의 봉지로 원하는 설탕만큼을 배달해야 합니다.
- 정확하게 N 킬로그램을 만들 수 없다면 -1 을 출력합니다.
문제 해결
- 문제를 해결하기 위해서는 먼저 작은 숫자의 출력값부터 생각해봅니다.
- 1은 -1
- 2는 -1
- 3은 1, arr[3] = arr[3]
- 4는 -1
- 5는 1, arr[5] = arr[5]
- 6은 2, arr[6] = arr[3] + arr[3]
- 7은 -1
- 8은 2, arr[8] = arr[5] + arr[3]
- 9는 3, arr[9] = arr[6] + arr[3]
규칙을 찾아보면 arr[i-5] + arr[i-(i-5)] 또는 arr[i-3] + arr[i-(i-3)] 의 값이 arr[i]의 값으로 들어가는 것을 확인할 수 있습니다.
하지만 이 값들은 해당 arr[i-5] 와 arr[i-3] 이 -1이 아니라는 가정하에 값이 추가되어야 합니다.
최소한의 봉지 개수로 설탕을 배달해야 하므로 arr[i-5]+arr[i-(i-5)] 의 크기를 먼저 조건문으로 넣으면 원하는 값을 구할 수 있게 됩니다.
var line = Int(readLine()!)!
var arr = [-1, -1, -1, 1, -1, 1]
for i in 6...5000 {
if arr[i-5] != -1 {
arr.append(arr[i-5]+arr[i-(i-5)])
} else if arr[i-3] != -1 {
arr.append(arr[i-3]+arr[i-(i-3)])
} else {
arr.append(-1)
}
}
print(arr[line])
'Algorithm > Baekjoon' 카테고리의 다른 글
Swift - 백준 2798번 블랙잭 (1등 코드) (0) | 2024.08.08 |
---|---|
Swift - 백준 11650번 좌표 정렬하기 (정렬) (0) | 2024.08.07 |
Swift - 백준 2292 벌집 (0) | 2024.08.05 |
Swift - 백준 1929 소수 구하기 (0) | 2024.08.04 |
Swift 백준 1654 랜선 자르기 (이분탐색) (0) | 2024.08.03 |