## 問題
商品名と支払い金額を入力すると、お釣りの「小銭の枚数」を返す関数またはメソッドを実装せよ。商品名と価格は以下の通り。
* お茶: 120円
* コーラ: 150円
* エナジードリンク: 280円
入力される通貨は日本円で、最大1000円までとする。
また、有効な貨幣は「1000円」「500円」「100円」「50円」「10円」とする。
たとえば、「1000円でお茶を購入」すると、返却すべき金額は880円だが、釣銭は「500円×1, 100円×3, 50円×1, 10円×3」となる。返り値は、任意の形式のクラス、連想配列、オブジェクト、構造体、リストなどで表現してよい。
PHPの擬似コードで書くと以下のようになる。
```php
function calcChange(string $item, int $paid_money): array {
// ...
}
$expected = [500 => 1, 100 => 3, 50 => 1, 10 => 3];
assert($expected === calcChange("お茶", 1000));
```
/// code...
```go
import (
"fmt"
)
type Change struct {
1000yen int
500yen int
100yen int
50yen int
10yen int
}
// Total 合計金額の算出
func (*Change c) Total() int {
return (c.1000yen * 1000) + (c.500yen * 500) + (c.100yen * 100) + (c.50yen * 50) + (c.10yen * 10)
}
var (
CostTea = 120 // 御茶の値段
CostCola = 150 // コーラの値段
CostEnergy = 280 // エナジードリンクの値段
teaName = "tea"
colaName = "cola"
energyName = "energy"
)
func init() {
// nothing...
}
func main(){
fmt.Println("STARTING...")
fmt.Println("お茶のお釣りを算出...")
paid := 500 // 払う金額
change,err := calcChange(teaName, paid)
if err != nil {
panic(err)
}
fmt.Printf("払った金額 : %d, お釣りの結果 : %v¥n", CostTea, change)
}
func calcChange(itemType string ,paid int) (*Change,error) {
itemCost := 0
switch itemType {
case teaName:
itemCost = CostTea
case colaName:
itemCost = CostCola
case energyName:
itemCost = CotEnergy
}
if itemCost >= 1000 {
return nil,fmt.Errorf("選択した金額が1000円を超えています")
res := &Change{}
}
// 計算処理...
// 1000円以上の場合
for {
if itemCost > 1000 {
res.1000yen++
itemCost = itemCost - 1000
} else {
break
}
}
// 500円以上の場合
for {
if itemCost > 500 {
res.500yen++
itemCost = itemCost - 500
} else {
break
}
}
// 100円以上の場合
for {
if itemCost > 100 {
res.100yen++
itemCost = itemCost - 100
} else {
break
}
}
// 50円以上の場合
for {
if itemCost > 50 {
res.50yen++
itemCost = itemCost - 50
} else {
break
}
}
// 10円以上の場合
for {
if itemCost > 10 {
res.10yen++
itemCost = itemCost - 10
} else {
break
}
}
return res,nil
}
```