コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 014 A – けんしょう先生のお菓子配り

  • by

■はじめに

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

■問題

●出典

AtCoder Beginner Contest 014のA問題
https://atcoder.jp/contests/abc014/tasks/abc014_1

●問題文

幼稚園の先生であるけんしょう先生は,持っている a 個のお菓子を b 人の児童に同じ数ずつ配りたいと思っています.けんしょう先生は持っているお菓子を全て配りきりたいと思っていますが,a と b の組によっては全員に同じ数ずつ配りきれないことがあることに気づきました. そこで,けんしょう先生は必要最低限のお菓子を買い足すことにしました.たとえば,7 つのお菓子を 3 人に配るシチュエーションを考えてみましょう.今のままでは同じ数配りきれないので,2 個のお菓子を買い足せばお菓子の数は 9 個となり,3 人に 3 個ずつ配ることが出来ます.

 さて,天才プログラマ児童たかはし君であるあなたは,いくつのお菓子を買い足せば良いかを先生に教えてあげるために,プログラムを作ることにしました

●入力

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

a
b
  • 1 行目には,けんしょう先生が最初に持っているお菓子の数を表す整数 a(1≦a≦100) が与えられる.
  • 2 行目には,児童の数を表す整数 b(1≦b≦100) が与えられる.

●出力

けんしょう先生が買い足さなければならないお菓子の個数を 1 行に出力せよ.出力の末尾に改行をいれること.

■回答

●愚直に書く

aをbで割って割り切れなかった場合に買い足す必要が出てくる。ということは、

a = gets.to_i
b = gets.to_i
puts a % b == 0 ? 0 : b - a % b

通った!三項演算子も何も見ずに書けるようになってきた〜(今更)

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

おそらく上の回答の方が良いけど、別解を思いついたのでやってみる。

  • aからbを引く
  • a > 0の場合は、もう一回bを引く
    • a == 0になったら0を表示
    • a < 0になったら、その絶対値を表示

という感じでも導けそう。
書いてて思ったけど、0の絶対値は0だから「a <= 0になったらその絶対値を表示」で良いか。

a = gets.to_i
b = gets.to_i
num = a - b
while num > 0 do
  num = num -b
end
puts num.abs

通った!
a <= 0になったら」じゃなくて「a > 0の間は処理を続ける」ということか。
コード長は長くなったけど実行時間はほんの少し短くなった。

ちなみに、演算子の省略はいまだに慣れないけど、

a = gets.to_i
b = gets.to_i
num = a - b
while num > 0 do
  num -= b
end
puts num.abs

こちらの方がスマート。

●他の方の回答例

割愛

●出てきたメソッド等

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

■振り返りなど

今日は時間がないので他の回答例は割愛