From 58e2e03e9687404aaa6f3f6c4782b219b5704005 Mon Sep 17 00:00:00 2001 From: "go-interview-practice-bot[bot]" <230190823+go-interview-practice-bot[bot]@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:19:32 +0000 Subject: [PATCH] Add solution for Challenge 22 --- .../submissions/nzamulov/solution-template.go | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 challenge-22/submissions/nzamulov/solution-template.go diff --git a/challenge-22/submissions/nzamulov/solution-template.go b/challenge-22/submissions/nzamulov/solution-template.go new file mode 100644 index 00000000..690afcef --- /dev/null +++ b/challenge-22/submissions/nzamulov/solution-template.go @@ -0,0 +1,59 @@ +package main + +import ( + "fmt" +) + +func main() { + // Standard U.S. coin denominations in cents + denominations := []int{1, 5, 10, 25, 50} + + // Test amounts + amounts := []int{87, 42, 99, 33, 7} + + for _, amount := range amounts { + // Find minimum number of coins + minCoins := MinCoins(amount, denominations) + + // Find coin combination + coinCombo := CoinCombination(amount, denominations) + + // Print results + fmt.Printf("Amount: %d cents\n", amount) + fmt.Printf("Minimum coins needed: %d\n", minCoins) + fmt.Printf("Coin combination: %v\n", coinCombo) + fmt.Println("---------------------------") + } +} + +// MinCoins returns the minimum number of coins needed to make the given amount. +// If the amount cannot be made with the given denominations, return -1. +func MinCoins(amount int, denominations []int) int { + if amount == 0 { + return 0 + } + c := CoinCombination(amount, denominations) + if len(c) == 0 { + return -1 + } + m := 0 + for _, val := range c { + m += val + } + return m +} + +// CoinCombination returns a map with the specific combination of coins that gives +// the minimum number. The keys are coin denominations and values are the number of +// coins used for each denomination. +// If the amount cannot be made with the given denominations, return an empty map. +func CoinCombination(amount int, denominations []int) map[int]int { + m := make(map[int]int) + for i := len(denominations) - 1; amount > 0 && i >= 0; i-- { + for amount > 0 && denominations[i] <= amount { + amount -= denominations[i] + m[denominations[i]]++ + } + } + return m +}