コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 055 A – Restaurant

  • by

■はじめに

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

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

■問題

●出典

AtCoder Beginner Contest 055のA問題
https://atcoder.jp/contests/abc055/tasks/abc055_a

●問題文

すぬけくんはレストランに通うのが好きです。

すぬけくん行きつけのレストランは何を食べても 1 食 800 円で、15 食食べる毎にその場で 200 円もらえます。

すぬけくんは今までで合計 N 食食べました。 今までに払った金額を x 円、レストランからもらった金額を y 円として、x−y を求めなさい。

●制約

  • 1≦N≦100

●入力

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

N

●出力

答えを出力せよ。

■回答

●愚直に書く

15食ごとに200円もらえるので、割り算の/を使うと余りが消えるという性質を利用して計算できそう。

n = gets.to_i
puts 800 * n - n / 15 * 200

通った!

●メソッド化して書く

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

今回は、メインメソッド、支払い総額を求めるメソッド、キャッシュバックされる額を求めるメソッド、標準入力を取得するメソッドの4つ。
いつも大抵3つのメソッドなので、4つは新鮮で良い。

def main
  n = read_num
  puts amount(n) - cashback(n)
end

def amount(n)
  800 * n
end

def cashback(n)
  n / 15 * 200
end

def read_num
  gets.to_i
end

main

通った!!

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

全然思いつかないなぁ…。もっとスマートな方法はあるのだろうか。
わからないので他の方の回答を見ることにする。

●他の方の回答例

上位の皆さんも同じ考え方だった。

●出てきたメソッド等

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

今回は無し。

■振り返りなど

前回かなり難しかったのに比べると今回はスムーズにできて良かった。

この問題自体はメソッド化するまでもないけど、合計額・キャッシュバック額をそれぞれ別メソッドにしておいてメインメソッドで繋げるというのはコード的に見通しが良い気がしてメソッド化の良い練習になった。