## 問題
商品名と支払い金額を入力すると、お釣りの「小銭の枚数」を返す関数またはメソッドを実装せよ。商品名と価格は以下の通り。
* お茶: 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));
```
## 回答
```php=
class Vendor
{
private $product_values;
public function __constructor($product_values)
{
$this->product_values = $product_values;
}
public function calcChange(string $item, int $paid_money): array
{
assert($paid_money > 10);
// お釣り
$remaining = $paid_money - self::product_values[$item];
$coins = [
500 => 0,
100 => 0,
50 => 0,
10 => 0,
];
foreach ($coins as $coin => $_) {
$coins[$coin] = intdiv($remaining, $coin);
$remaining = $remaining % $coin;
}
return $coins;
}
}
$vendor1 = new Vendor([
'お茶' => 120,
'コーラ' => 150,
'エナジードリンク' => 280,
]);
$vendor2 = new Vendor([
'レッドブル' => 280,
'レッドブル ホワイト' => 280,
]);
$expected = [500 => 1, 100 => 3, 50 => 1, 10 => 3];
assert($expected === $vendor->calcChange("お茶", 1000));
```