コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 061 A – Between Two Integers

  • by

■はじめに

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

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

■問題

●出典

AtCoder Beginner Contest 061のA問題
https://atcoder.jp/contests/abc061/tasks/abc061_a

●問題文

3 つの整数 A,B,C が与えられます。
整数 C が A 以上 かつ B 以下であるかを判定してください。

●制約

  • −100≦A,B,C≦100
  • A,B,C は全て整数

●入力

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

A B C

●出力

条件を満たす場合はYes、そうでない場合はNoを出力せよ。

■回答

●愚直に書く

まずは愚直に条件分岐。

a, b, c = gets.split.map(&:to_i)
if c >= a && c <= b
  puts "Yes"
else
  puts "No"
end

通った!

●メソッド化して書く

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

def main
  a, b, c = read_nums
  puts is_middle?(a, b, c)
end

def is_middle?(a, b, c)
  if c >= a && c <= b
    "Yes"
  else
    "No"
  end
end

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

main

通った!!

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

問題を見た時から、maxminを使えるんじゃないかと睨んでいた。
「整数 C が A 以上 かつ B 以下」ということは、Aが一番小さくてBが一番大きい(つまりCは真ん中)ということなので、1つの変数に配列で3つの数字を取ってきて、minmaxを使えそう。

n = gets.split.map(&:to_i)
if n[0] == n.min && n[1] == n.max
  puts "Yes"
else
  puts"No"
end

通った!嬉しい。ただ、そこまでスマートというわけでもないか…。

あとは三項演算子か。

a, b, c = gets.split.map(&:to_i)
puts c >= a && c <= b ? "Yes" : "No"

●他の方の回答例

minmaxの範囲内にあるかを判定するbetween?メソッドというのを使っている人がいた。このメソッド初めて見た…!

a, b, c = gets.split.map(&:to_i)
puts c.between?(a,b) ? "Yes" : "No"

●出てきたメソッド等

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

■振り返りなど

between?メソッド、知っておくと便利そう。