k-tokitoh

2018-12-08

AtCoder Regular Contest 103 C

.

学んだこと
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