コロナで無職になった私がエンジニアになるまで

コロナの影響で前職をクビになってから、エンジニアを目指してます。

Rubyの練習問題 ~eachを使って配列内の重複する値の検証~

問題.1

任意の3つの数値の合計を出力するメソッドを作りましょう。
ただし、同じ数が含まれている場合は
合計にカウントされません。

 

[自分の解答]

def lone_sum(array)
  uniq = []
  array.each do |num|
    count = 0
    array.each do |i|
      if num == i
        count += 1
      end
    end
    if count == 1
      uniq << num
    end
  end

  sum = 0
  uniq.each do |u|
    sum += u
  end

  puts sum

end

まずは与えられる引数(配列)の中に重複する値があるかを検証する。

重複する値が入るための空の配列を用意する。
次にeachメソッドを引数の配列に対して使用する。
この時に注意するのは配列の中で重複する値a[0]を他の値とも検証しないといけないという点である。
つまり、eachをこのeach文の中で再度使用しなければならない。
こうすることで、最初のeachでa[0]の検証を配列の数字全てに対して検証することができる。
重複していれば、count(変数)をふやす。
もちろん一番最初の値は絶対に重複するが、そのcountが1である場合のみ空の配列に加えるようにすれば、結果的に重複しない値のみが入るということになる。

あとは重複しない値が入った配列に対してeachを使って足して出力する。

 

[正答]

def lone_sum(ary)
  # 配列から、重複しない要素のみ取り出す
  uniq_nums = []
  ary.each do |num|
    count = 0
    ary.each do |i|
      if num == i
        count += 1
      end
    end
    if count < 2
      uniq_nums << num
    end
  end

  # uniq_nums配列内の合計
  sum = 0
  uniq_nums.each do |unique_num|
    sum += unique_num
  end

  puts sum

正答の問題と異なる点は重複する値のcountの条件分岐。
正答では、count < 2になれば空の配列に格納とある。
ここで注意する点は <= 2ではないこと。
つまりcountが2になった時点では空の配列に格納しないということ。
ここが初見で理解できなかった。
ぱっと見countが2になったら空の配列に加えるという文に見えてしまう。