## 問題 商品名と支払い金額を入力すると、お釣りの「小銭の枚数」を返す関数またはメソッドを実装せよ。商品名と価格は以下の通り。 * お茶: 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)); ```