本日もrubyのアルゴリズム問題から、勉強になった部分を抜粋。
問題
以下の配列から、数を探して何番目に含まれているか結果を返す
メソッドを作成してください
input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
自分の解答
def search(input, num) if input.include?(num) count = input.index(num) puts "#{count}番目にあります" else puts "その数は含まれていません" end end input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93] puts "整数を入力してください" num = gets.to_i search(input, num)
まずinclude?で配列の中にその要素が含まれているかを検証し、
indexでその要素が何番目にあるかを抽出した上で、出力しています
(countに1を足すのを忘れている)
模範解答
def search(target_num, input) input.each_with_index do |num, index| if num == target_num puts "#{index + 1}番目にあります" return end end puts "その数は含まれていません" end input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93] search(11, input)
私の解答のように、まず要素があるかどうかを検証するのではなく
each_with_indexで要素全てに対し、与えられた引数と一致するかどうか
を検証しています
当然こちらの方が
先に要素の有無を検証→何番目かを確認するよりも
工数が少なく済む様子。
改善した解答
def search(input, target_num)
input.each_with_index do |num, index|
if num == target_num
puts "#{index + 1}番目にあります"
return
end
end
puts "その数は含まれていません"
end
input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
puts "整数を入力してください"
num = gets.to_i
search(input, num)
最初に模範解答を見た時、puts "その数は含まれていません"
がif文の中に入っていないことに疑問を持ちましたが、
よく見るとreturnで処理が終わっているので、
numとtarget_numが一致したらこの部分は実行されないですね。
その考え方はしたことがなかったので勉強になりました。
反省点
- 配列の中身の要素に対しては、一つずつ検証という概念を持つようにする
- if~elseを多様する前にreturnで表現できないか考える
- 要素の何番目かを検証する際の+1忘れなど、ケアレスミスをなくす