コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 066 A – ringring

■はじめに

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

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

(2022/10/17時点の方針)
しばらくはB問題を小さい番号の方からやっていく。たまにA問題もやるかも。

■問題

●出典

AtCoder Beginner Contest 066のA問題
https://atcoder.jp/contests/abc066/tasks/abc066_a

●問題文

snuke 君は自転車を買いに来ました。 snuke 君はすでに買う自転車を決めたのですが、その自転車にはベルが付いていないため、 自転車とは別にベルも買う必要があります。

snuke 君は安全意識が高いので、ベルをどちらの手でも鳴らせるよう、両方のハンドルに 1 つずつ 付けることにしました。

お店にあるベルは 3 種類で、それぞれ a円、 b円、 c円です。 この 3 つのうち、異なる 2 つのベルを選んで買うときの、値段の合計の最小値を求めて下さい。

●制約

  • 1≤a,b,c≤10000
  • a,b,c は整数

●入力

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

a b c

●出力

2 つのベルを買うときの最安値を出力せよ。

■回答

●愚直に書く

つまり小さい数字2つの合計を出せば良い。
並び替えをして下から2つを数える。

a = gets.split.map(&:to_i)
puts a.sort[0] + a.sort[1]

通った!

●メソッド化して書く

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

メインメソッド、数字の低い2つを足すメソッド、標準入力を取るメソッドの3つ。

def main
  a = read_nums
  puts calculate_price(a)
end

def calculate_price(bells)
  bells.sort[0] + bells.sort[1]
end

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

main

通った!

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

ふと思いついたけど、全部足して、maxを引くというのはどうだろう。

a = gets.split.map(&:to_i)
puts a.sum - a.max

通った!

●他の方の回答例

あっ、そうか、min(n)で小さい順にn個の要素を求められるのか。

a = gets.split.map(&:to_i)
puts a.min(2).sum

シンプル!

●出てきたメソッド等

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

今回は特に無し。

■振り返りなど

min(n)でスマートに書きたかった。