AtCoder Regular Contest 103 C
いままでPythonで書いてたけど今後RubyつかうことになりそうなのでRubyで書いてみた。
学んだこと
- Rubyでの標準入出力のしかた
- 配列から奇数/偶数番目の要素だけ取り出したいなら、select.with_index
- 配列で値の出現回数をハッシュに記録するなら、inject
- hash#sortだとキー順の並び替えになるので、値で並べ替えたいならブロックを渡すこと
n = gets.chop.to_i array = gets.split.map(&:to_i) # 偶数のみ、奇数のみの配列を抽出する even = array.select.with_index {|a, i| i%2 == 0 } odd = array.select.with_index {|a, i| i%2 == 1 } # どの数字が何回出現するかを示すハッシュをつくる even_count = even.inject(Hash.new(0)){|hash, e| hash[e] += 1; hash} odd_count = odd.inject(Hash.new(0)){|hash, o| hash[o] += 1; hash} # 出現回数順に並べ替える even_count = even_count.sort {|(k1, v1), (k2, v2)| v2 <=> v1 } odd_count = odd_count.sort {|(k1, v1), (k2, v2)| v2 <=> v1 } # 出現回数トップの数字が異なる場合 if even_count[0][0] != odd_count[0][0] replace = n - (even_count[0][1] + odd_count[0][1]) # 出現回数トップの数字が同じ場合 else # 1種類しか数字がない場合は、2番目に多い数字の出現回数を0とする if even_count.size > 1 even_second = even_count[1][1] else even_second = 0 end if odd_count.size > 1 odd_second = odd_count[1][1] else odd_second = 0 end replace = n - [even_count[0][1] + odd_second, even_second + odd_count[0][1]].max end p replace
コード量5分の1くらいで済むっぽいので他人の読んで学ぼう。