# 問題
商品名と支払い金額を入力すると、お釣りの「小銭の枚数」を返す関数またはメソッドを実装せよ。
商品名と価格は以下の通り。
- お茶: 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));
```
---
```typescript=
export type Coins = 500 | 100 | 50 | 10;
export type Change = Map<Coins, int>;
const _item = {"お茶": 120, "コーラ": 150, "エナジードリンク": 200};
export const Change = {
items: _item,
calcChange: function(item_name: string, paid_money: number): Change {
if(_item[item_name] === undefined) {
throw Error("unexpected item");
}
let return_cost = paid_money - _item[item_name];
if (return_cost < 0) {
throw Error(`cannot buy item ${string}`);
}
const ret = {};
const coins = [500, 100, 50, 10];
for(coin of coins) {
ret[coin] = Math.floor(return_cost / coin);
return_cost -= coin * ret[coin];
}
return ret;
}
}
```