コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 036 A – お茶

  • by

INDEX

■はじめに

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

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

■問題

●出典

AtCoder Beginner Contest 036のA問題
https://atcoder.jp/contests/abc036/tasks/abc036_a

●問題文

高橋君はお茶のペットボトルが A 本入った箱を買うことにしました。 高橋君は少なくとも B 本のお茶のペットボトルがほしいです。 箱を何箱買えばよいですか。

●制約

  • 1≤A,B≤1000

●部分点

  • 50 点分のテストケースでは、B は A の倍数である。

●入力

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

A B

●出力

高橋君が買わなければならない箱の個数の最小値を出力せよ。

■回答

●愚直に書く

BをAで割って繰り上げれば良さそうか?
繰り上げのメソッドはceilで、小数点を繰り上げするからto_iでなくto_fで取っておいたほうが良いか。

a, b = gets.split.map(&:to_f)
puts (b / a).ceil

通った!

●メソッド化して書く

メソッドを作る練習のために、あえてそういう書き方をする。
今回はメインメソッドと標準入力を取得するメソッドの2つだけにした。

def main
  a, b = read_number
  puts (b / a).ceil
end

def read_number
  gets.split.map(&:to_f)
end

main

通った!

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

別の方法あるかな。
余りがあるか無いかで条件分岐するとかは余計ややこしくなるのでイマイチな気がする。

●他の方の回答例

上位勢の書き方が(b+a-1)/aが多い。
はじめto_iで整数で取ってきて、上の計算をすると余りが切り捨てられて意図した結果になるんだな。なるほど…!

●出てきたメソッド等

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

■振り返りなど

上位勢の回答はいかにも数学な感じ(?)でサラッとかけたらカッコ良さそうだけど、パッと見でわかりやすいかと言われるとどうなんだろう…。