저번에 풀었던 암호코드와 유사하게 다이나믹 프로그래밍으로 풀면 된다.
package main
import "fmt"
var m = map[int]int{}
func main() {
N := 0
fmt.Scan(&N)
// 기저상태
m[5] = 1
m[3] = 1
fmt.Print(calcLeast(N))
}
func calcLeast(weight int) int {
if value, exists := m[weight]; exists { //이미 계산해둔 값이 있으면 활용
return value
} else if weight < 3 { // 무게가 3이하면 -1
m[weight] = -1
} else { // 그 외의 상황에는 w-5, w-3일 때를 재귀호출해 최소값 선택
m[weight] = min(calcLeast(weight-5), calcLeast(weight-3))
}
return m[weight]
}
func min(a, b int) int {
if a == -1 && b == -1 { // 두 값 모두 -1일 땐 -1 반환
return -1
} else if a == -1 { // 두 값 중 하나만 -1일 땐 다른 값에 +1을 반환
return b + 1
} else if b == -1 {
return a + 1
} else if a <= b { // 두 값 모두 유효하면 작은 값 선택 후 +1
return a + 1
}
return b +1
}
❌
❌
❌
❌