Rubyを使ったアルゴリズムについて学習しています。
今回は、特定の金額を与えられたときに、どのようにそれを最小の枚数の紙幣と硬貨に分けるかを求めていきます。
完成コード
money = 7468
currencies = [10000, 5000, 1000, 500, 100, 50, 10, 5, 1]
result = {}
currencies.each do |currency|
count = money / currency
money %= currency
result[currency] = count
end
puts result
このコードは各紙幣・硬貨で金額を割ってその商(枚数)を得て、それをresultハッシュに保存している。そして、その紙幣・硬貨で金額を割った余りを次の紙幣・硬貨の計算のための金額とする。これを最小の紙幣・硬貨まで繰り返すことで、最小の枚数で金額を分けることができる。
コードの解説
このコードは、ある金額を最小の紙幣と硬貨の枚数で 表すためのプログラム。
- 最初に
money = 6498
と定義して、分解したい金額を設定してる。 - 次に
currencies = [10000, 5000,1000,500, 100, 50, 10, 5, 1]
と定義して、利用できる紙幣と硬貨の種類を設定してる。 -
result = {}
で、各紙幣と硬貨ごとの枚数を 保存するためのハッシュを初期化してる。 -
currencies.each do |currency
で、currencies
配列の各要素(紙幣や硬貨の額面) に対して以下の処理を行う。 -
count = money/currency
で、 現在の金額を 現在の紙幣・硬貨の額面で割った商 (いくつ該当の紙 幣・硬貨が使えるか) を計算してる。 -
money %= currency
で、 現在の金額を現在の紙幣・硬貨の額面で割った余り(次の紙幣・硬貨を使うための残りの金額)を計算してる。 -
result[currency] = count
で、現在の紙幣・硬貨の額面とその枚数をハッシュに保存してる。 - 最後に
puts result
で、各紙幣・硬貨の枚数を出力してる。
ポイント
-
each文
を使い、配列の値を一つずつ代入してその下の計算を実施している。
-
a %= b
は代入演算子である。a = a % b
と同じ意味。