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くらいで済むっぽいので他人の読んで学ぼう。