---
# System prepended metadata

title: Untitled

---

## 問題

商品名と支払い金額を入力すると、お釣りの「小銭の枚数」を返す関数またはメソッドを実装せよ。商品名と価格は以下の通り。

 * お茶: 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));
```

## 回答
```python
class Error(Exception):
    pass

Items = {"お茶": 120, "コーラ":150, "エナジードリンク": 280}
Coins =  [1000, 500, 100, 50, 10]
Coins.sort(reverse=True)

def calcChange(item_name, paid_money):
    if item_name not in Items.key():
        raise Error("Invalid item name.")
    
    if Items[item_name] > paid_money:
        raise Error("Money not enough.")
    
    if paid_money % 10 != 0:
        raise Error("Invalid money.")

    change = paid_money - Items[item_name]
    change_coins = {}
    for coin in Coins:
        change_coins[coin] = change // coin
        change = change % coin
    return change_coins

def test():
    calcChange()
```