AtCoderをやって9 (Colorful Leaderboard)

問題

AtCoderでは、コンテストに参加すると「色」が付き、これはレートによって次のように変化します:

  • レート 1-399:灰色
  • レート 400-799:茶色
  • レート 800-1199:緑色
  • レート 1200-1599:水色
  • レート 1600-1999:青色
  • レート 2000-2399:黄色
  • レート 2400-2799:橙色
  • レート 2800-3199:赤色

また、レートが 3200 以上になると色を自由に変えることができます。 現在 N 人の人がAtCoderのコンテストに参加したことがあり、i 人目の人のレートは a iです。 そのとき、色の種類数の最小値と最大値を求めなさい。

自分の回答(他の方の解答参照)

解き方をどうするかでそもそも躓いてしまいました。 ポイントは

  • レート3200以上は別でカウントする(色が他のレートと同一の場合と、違う色の場合それぞれが存在する為)
  • その他のレートは400毎に変わっているのでレートを除算の商で区別できる

最初何でレートを400で割った商で区別できるんだ?と思ったけど、rubyの除算の商は整数を返す(小数点切り捨て)からですね。

 n = gets.chomp.to_i
# レート3200以上の場合をカウント
top_cnt = 0
# それ以外のレートの場合は400の除算の商を格納
rate_number = []

gets.chomp.split.map(&:to_i).each do |i|
  if 3200 <= i
    top_cnt += 1
  else
    rate_number << (i / 400)
  end
end

if rate_number.empty?
  # 3200以上のレートだけだった場合
  puts "1 #{top_cnt}"
else
  number_of_types = rate_number.uniq.count
  puts "#{number_of_types} #{number_of_types + top_cnt}"
end