yuuki blog

プログラミング をアプトプットしています。

Ruby API問題(2問題.1 任意の3つの数値の合計を出力するメソッドを作りましょう。 ただし、同じ数が含まれている場合は 合計にカウントされません。 出力例: lone_sum([1, 2, 3]) → 6 lone_sum([3, 2, 3]) → 2 lone_sum([3, 3, 3]) → 0)

 問題

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

 出力例

lone_sum([1, 2, 3]) → 6
lone_sum([3, 2, 3]) → 2
lone_sum([3, 3, 3]) → 0

 

自分の回答

def lone_sum(strs)
  sum = 0
  strs.each do |num|     #each文で各値を取り出します
    if strs.count(num) == 1 
    #countを用い1でない(重複していない値をsumにたします)
sum += num end end puts sum end

模範回答

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

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だけが追加されます。

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