コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 044 A – 高橋君とホテルイージー

  • by

INDEX

■はじめに

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

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

■問題

●出典

AtCoder Beginner Contest 044のA問題
https://atcoder.jp/contests/abc044/tasks/abc044_a

●問題文

1 軒のホテルがあります。 このホテルの宿泊費は、次のようになっています。

  • 最初の K 泊までは、1 泊あたり X 円
  • K+1 泊目以降は、1 泊あたり Y 円

高橋君は、このホテルに N 泊連続で宿泊することにしました。 高橋君の宿泊費は合計で何円になるか求めてください。

●制約

  • 1≤N,K≤10000
  • 1≤Y<X≤10000
  • N,K,X,Y はいずれも整数である

●入力

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

N
K
X
Y

●出力

高橋君の宿泊費の合計金額を表す整数を出力せよ。

■回答

●愚直に書く

通常料金のK泊目までと割引が発生するK+1泊目以降で分ける感じかな。

n = gets.to_i
k = gets.to_i
x = gets.to_i
y = gets.to_i

if n > k
  puts x * k + y * (n - k)
else
  puts x * n
end

通った!

●メソッド化して書く

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

今日は時間がないので割愛…!

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

三項演算子くらいかな?

n = gets.to_i
k = gets.to_i
x = gets.to_i
y = gets.to_i

puts n > k ? x * k + y * (n - k) : x * n

通った!

●他の方の回答例

readlines.map(&:to_i)を使えば1行で4つの変数に入れられる。なるほど。

n, k, x, y = readlines.map(&:to_i)

4.times.map{gets.to_i}でも行ける!

n, k, x, y = 4.times.map{gets.to_i}

●出てきたメソッド等

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

今回は特に無し。

■振り返りなど

複数行の標準入力の取り方を完全に忘れていた。

この2週間ほど余裕がゼロで全く勉強できず、9月後半までおそらく余裕が無いけど、時間があれば何回かやりたい。