【AtCoder-Ruby】ABC B - Bumble Bee(落葉拾い)
AB 問題の Time Atack のため、歯抜けになっている問題を埋めていたが、Hash 構文がうろ覚えでタイムロスした。。。
備忘のため記録しておく。
問題
問題文
高橋君はマルハナバチ(Bumblebee)という種類のミツバチです。 今日も花の蜜を求めて異なる N 個の花を訪れました。
高橋君が i 番目に訪れた花の種類は Ai です。
i 番目の花は、 i > j かつ i 番目の花の種類と j 番目の花の種類が同じになるような j が存在すれば受粉します。
高橋君が訪れた N 個の花の種類の情報が与えられるので、そのうちいくつの花が受粉したか求めてください。
なお、高橋君以外による受粉や自家受粉を考える必要はありません。
間違い
N = gets.strip.to_i h = {} N.times { h[gets.strip.to_i] += 1 } # => null エラー sum = 0 h.values do |v| sum += v - 1 end puts sum # => 0 のまま do end の処理がされていない?
Null エラーは Hash.new でデフォルト値を設定することで回避
# 0で初期化 h = Hash.new(0) # 空の配列で初期化したい場合はこれ h = Hash.new([])
sum が 0 問題は values は配列を返すので each が必要
sum = 0 h.values.each do |v| sum += v - 1 end puts sum # => 等価 puts h.values.inject(0) { |sum, v| sum += v - 1 }
回答
N = gets.strip.to_i h = Hash.new(0) N.times { h[gets.strip.to_i] += 1 } puts h.values.inject(0) { |sum, v| sum += v - 1 }
考察
配列、文字列操作、ハッシュは定期的に復習すること!
特にハッシュは出番が少ないので意識して復習が必要!