箱のプログラミング日記。

渋谷の自社開発企業でRails書いてます。

each_with_indexをうまく使う【rubyアルゴリズム】

f:id:y_hakoiri:20191102134313j:plain

本日も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忘れなど、ケアレスミスをなくす