알고리즘/백준
[백준/Swift] 2839번: 설탕 배달
녕이
2023. 2. 16. 21:32
728x90
https://www.acmicpc.net/problem/2839
2839번: 설탕 배달
상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그
www.acmicpc.net
이 문제는 DP 또는 Greedy로 풀 수 있는데, DP 연습을 하고 있기 때문에 DP로 풀어봤다!
우선, 차분히 예제를 두고 쭉 적어봤다. 규칙을 찾아야 하기 때문!
- 3의 배수
- 5의 배수
- 3와 5의 합으로 나올 수 있는 수
그런데 쭉 숫자들을 적어 내리다 보니, 8(3+5) 이후로는 3과 5로 모두 나타낼 수 있었다!
그래서, 초기값을 3, 5, 6으로만 주고 8 이후로 작은 문제의 답으로 큰 문제의 답을 내는 dp를 구현했다.
8 이후의 수는 이전 값에 3을 더한 값 / 이전 값에 5를 더한 값 으로 나뉘기 때문에
min(dp[i-3], dp[i-5]) + 1로 했다.
여기서 더 추가할 것은, dp[i-5]가 0일 수도 있다는 것이다! dp[12]의 경우, dp[12-5] = dp[7] = 0 이므로 이 부분을 꼭 생각해야 한다.
import Foundation
//input
let n = Int(readLine()!)!
var dp = [Int](repeating: 0, count: 5001)
dp[3] = 1
dp[5] = 1
dp[6] = 2
if n >= 8 {
for i in 8...n {
dp[i] = min(dp[i-3] == 0 ? n+1 : dp[i-3], dp[i-5] == 0 ? n+1 : dp[i-5]) + 1
}
}
print(dp[n] == 0 ? -1 : dp[n])
dp는 어려운데 재미있다...! 규칙 찾아내기~~
728x90