コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 037 A – 饅頭

  • by

■はじめに

Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)

(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。

■問題

●出典

AtCoder Beginner Contest 037のA問題
https://atcoder.jp/contests/abc037/tasks/abc037_a

●問題文

あなたは饅頭の店に来ています。ここでは白と緑の 2 種類の饅頭が売られていて、それぞれの種類は何個でも買うことができます。 白色の饅頭は 1 個 A 円で、緑色の饅頭は 1 個 B 円です。

あなたは C 円持っています。あなたはとにかく沢山の個数を食べたいので、種類は気にせず、なるべく多くの個数の饅頭を買おうと思っています。 2 種類で買う個数が違ったり、片方の種類しか買わなかったりしてもかまいません。

最大で何個の饅頭が買えるでしょうか。

●制約

  • 1≤A,B≤1,000
  • 1≤C≤1,000,000

●入力

入力は以下の形式で標準入力から与えられる。

A B C

●出力

あなたが買える饅頭の個数の最大値を出力せよ。

■回答

●愚直に書く

AとBで安い方を買えるだけ買う、ということか。

a, b, c = gets.split.map(&:to_i)
puts c / [a, b].min

通った!

●メソッド化して書く

メソッドを作る練習のために、あえてそういう書き方をする。
今回は、

  • 最後の割り算をするメソッド
  • AとBの小さい値を取るメソッド
  • 標準入力を取るメソッド

に分けてみた。

def main
  a, b, c = read_nums
  puts c / judge_min(a, b)
end

def judge_min(a, b)
  [a, b].min
end

def read_nums
  gets.split.map(&:to_i)
end

main

通った!

●リファクタリング/別アプローチ

思い浮かばないので割愛。

●他の方の回答例

上位の方も考え方は同じだった。
何人か*a, cで標準入力を取っていて何だっけと思って調べた。

*をつければ引数を複数個設定できる。
これを可変長引数という。
https://qiita.com/rtoya/items/33617078501776fdcad7

なるほど。

*a, c = gets.split.map(&:to_i)
p a, c

上記で、標準入力が8 6 20だと以下になる。

[8, 6]
20

なるほど、これでaとbをそれぞれ取得して[a, b].minとしていた部分がa.minだけで良くなるのか〜。

●出てきたメソッド等

公式リファレンスを見る訓練。

■振り返りなど

可変長引数。何度か何度か見たことあったけど忘れてたので覚えたい。可変長引数。可変長引数。