kotazon.com

虎太郎の備忘録

【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 }

考察

配列、文字列操作、ハッシュは定期的に復習すること!
特にハッシュは出番が少ないので意識して復習が必要!

www.instagram.com