π λ¬Έμ λ§ν¬
https://www.acmicpc.net/problem/2839
π λ¬Έμ νμ΄ λ°©λ² (1) - μνμ μΈ νμ΄
μνμ μΌλ‘ μ κ·Όνλ©΄ μ¬μ€ κ΅μ₯ν κ°λ¨νκ² νλ¦°λ€. 첫λ²μ§Έ μμ μΈ 18λ‘ μλ₯Όλ€μ΄λ³΄μ.
"5λ‘ λ§ λλλ€κ° λ§μ§λ§μ 3μλ°°μκ° λλμ§ μ°Ύμ보면 μ΅μκ° μ°Ύμ μ μμ§μμ?" λΌκ³ μκ°ν μ μλ€. λλν κ·Έλ¬μκ³ ^__^ κ·Όλ° μμ 5λ²μ 보면, 11μ 5kg / 5kg νκ³ 1kgκ° λ¨κ²λμ΄μ -1μ μΆλ ₯νλκ² μλλΌ, 3kg / 3kg / 5kg λ‘ λ΄μ§λ₯Ό λ€ μ μλ€. κ·Έλμ 3μ΄λΌκ³ μΆλ ₯ν΄μΌνλ€. μ΄λ° μμΈμ¬νμ λ³΄κ³ μ½λλ₯Ό μ§μΌνλ€.
κ·Έλμ μ νν λ°©λ²μ, 5μ λ°°μμΈμ§ λ¨Όμ νμΈν΄μ€ λ€, 3μ λ°°μ£Όκ³ , λ€μ 5μ λ°°μμΈμ§ νμΈν΄μ£Όκ³ , κ·Έλλ μλλΌλ©΄ λ 3μ λΉΌμ£Όκ³ ... μ΄ κ³Όμ μ λ°λ³΅νλ©΄ λκ² λ€ λΌκ³ μκ°νλ€.
πΈ μνμ μΈ νμ΄ μ λ΅ μ½λ
var sugar = Int(String(readLine()!))!
var bag = 0
while sugar >= 3 {
if sugar % 5 == 0 {
bag += 1
sugar -= 5
} else {
sugar -= 3
bag += 1
}
}
if sugar == 0 {
print(bag)
} else {
print(-1)
}
π λ¬Έμ νμ΄ λ°©λ² (2) - DP λ‘ νκΈ° (λμ κ³νλ²)
μ¬μ€ μ΄ λ¬Έμ λ λ°±μ€μμ DP λ‘ λΆλ₯λμ΄μλ€. λ± λ³΄μλ§μ, λ°λ‘ μνμ μΈ νμ΄λ‘ νμ΄κ° κ°λ₯ν΄μ κ·Έλ₯ νμμ§λ§, λκ° 'μ°μν΄μ κ³μ°νλ€'λΌλ λ§μ΄ λͺ μμ μΌλ‘ μκΈ° λλ¬Έμ DPλ‘ νκ±°λΌκ³ μκ°μΉλ λͺ»νλ€. (κ·Έλ₯ μ μ΄μ μνμ μΈ νμ΄λ‘ λ무 κ°λ¨νκ² νλ €μ DPλ‘ νμκ°μ‘°μ°¨ μνλ κ² κ°λ€.)
κ·Έλ¬λ€κ° κΆκΈν΄μ Έμ dp λ‘λ νμ΄λ΄€λ€.
μ νμμ μ΄λ κ² λμΆλλ€.
i-5νμλ 0 μ΄νλ‘ λμ€κ² λλ©΄ index out of range μλ¬κ° λκΈ° λλ¬Έμ dp[3]κ³Ό dp[5] λ 1μ λ£μ΄μ£Όκ³ μμν΄μΌνλ€.
κ·Έλ¦¬κ³ ,,, μ λ ₯λλ nμ 3λΆν° μμμ΄μ§λ§, 4μλν μμΈμ²λ¦¬κ° νμνλ€. 4λ₯Ό μ²λ¦¬νμ§μμΌλ©΄ dp[5]λ out of range λΌμ μ»΄νμΌ μλ¬κ° λκΈ°λλ¬Έμ 4μΌλ print(-1)ν΄μ£Όλ μ²λ¦¬μ, dp[5]μ 1μ λ£μ΄μ£Όμ§ μλ κ³Όμ μ΄ νμνλ€!! (μ΄κ±° λλ¬Έμ μκ°μ κ±°μ 20λΆμ λ²λ¦°λ―, μ£Όμ΄μ§ μμ λ§κ³ λ€λ₯Έ μμ λ μ λ ₯ν΄λ³΄μ)
πΈ dp νμ΄ μ λ΅μ½λ
var n = Int(String(readLine()!))!
var dp = Array(repeating: 5001, count: n+1)
if n > 2 {
dp[3] = 1
if n > 4{
dp[5] = 1
}
}
if n > 5 {
for i in 6..<n+1 {
dp[i] = min(dp[i-3]+1, dp[i-5]+1)
}
}
if n == 4 {
print(-1)
} else {
if dp[n] > 5001 {
print(-1)
} else {
print(dp[n])
}
}