本日の基礎練習問題(22/3/17)


問題
以下の要件を満たすlone_sumメソッドを実装しましょう。
配列に格納された3つの数値の合計を出力する
ただし、同じ数値が2つ以上含まれている場合、その数値は合計する要素に含めない

def lone_sum(ary)
  # 処理を記述
end

*呼び出し例
lone_sum([1, 2, 3])
*出力例
lone_sum([1, 2, 3]) → 6
lone_sum([3, 2, 3]) → 2
lone_sum([3, 3, 3]) → 0

私の回答

def lone_sum(ary)
 newary = ary.uniq!
 puts newary.sum
end

# 呼び出し例
lone_sum([1, 2, 3])

解説

まずuniq!メソッドで配列内の重複している数値を取り除く。
その後配列の合計値を出力する。

模範回答

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
end

# 呼び出し例
lone_sum([1, 2, 3])

模範回答

3〜14行目で重複しない値のみ取り出す処理を、17〜20行目で重複しない値のみになった配列内の合計を求める処理を行っています。以下具体的に見てみましょう。

たとえば、lone_sum([3, 2, 3])でメソッドを呼び出した場合を考えてみましょう。

この場合、4行目で最初にnum=3となります。その後6行目でi=3, 2, 3となり、それぞれに対してnum=iとなったとき、つまり重複したときにcountが増えるようになっています。
そして、11行目では重複した値が1つのときだけ、uniq_nums配列に値を追加しています。num=3のときはcount=2となるので、uniq_nums配列に値は追加されません。
これを後2回繰り返した結果、uniq_nums配列には2だけが追加されます。

そして17行目以下でuniq_nums配列内の合計を求めます。
この場合はsum = sum + 2、つまりsum = 0 + 2となります。
その結果、合計は2と出力されます。

感じたこと

正直難しく模範回答を見てもあまり理解できなかった。
しかし1つ1つ丁寧に見たら少しづつ理解することができた。
eachの入れ子構造に苦戦したが今回の問題で理解を深められたので
当てはまる処理の場合は使用したい。