一言
今日からまた朝活復活
朝活続けるためにルールで自分縛り、Twitterで何かしら朝の活動をつぶやく
続けば良いが・・・。
それでは本題
配列から要素を取り出して計算
今日の投稿も以前に解いた問題の2回目に挑戦・・・。
今回のお達しは「配列内の数字を加算せよ。但し、配列内にある同じ数字は除外して計算。同じ数字は除外するので全部同じ数字の場合は0となる」
※出力例
number([3,3,3]) => 0
number([3,2,3]) => 2
number([3,4,3,6,7,9,3,2,5]) => 33
こんな感じに出せと。
で、重複した要素を取り出して足せばいいやと考え、「uniqメソッドとsumでいけるかな?」と思い、使ってみたが、結果できず・・・。
簡単にuniqメソッドについて解説
uniqメソッド
以下のような配列があるとする
a = [1,1,1,2,3,4,5,5,5]
uniqを使うことで、重複した数字を除き、新しい配列を返す
p a.uniq => [1,2,3,4,5]
確かに重複は取り除けたけれども・・・重複していた数字はすっきりはしたものの1つは残っちゃってて、一緒に加算してしまうから結果思い通りの出力ができない。
回答拝見
def number(nums)
new_array=[] #取り除いた配列を新しい配列に入れる用
nums.each do |num|
i = 0
nums.each do |n|
if num == n
i += 1
end
end
#①[4,5,4]だとまず最初は「num=4,5,4」となる
#最初のnumは「num=4」となり、nが「n=4,5,4」となる
#次にnumは「num=5」となり、nが「n=4,5,4」
#最後にnumは「num=4」となり、nが「n=4,5,4」
#numとnが同じ数字の時にカウントされる(重複した時)
if i < 2
new_array << num
end
#iのカウントが1の場合は条件に合うので、[new_array]という配列に追加される。
#iのカウントが2の場合は条件に合わない(4は[i=2]となる)
end
sum = 0
new_array.each do |i|
sum += i
end
#new_array配列内の合計
puts sum #出力
end
① number([4,5,4]) => 5
② number([3,4,3,6,7,9,3,2,5]) => 33
もっとシンプルにできないか、ない頭で考えたが頑張って最後の計算をsumメソッドを使うくらいしか思いつかず・・・。
puts new_array.sum
こんな感じ
もっと簡単に出せたり、簡単じゃなくても他の方法があればコメントいただけると嬉しいです。