問題

n個のファイル名が与えられる。同じ名前が重複する場合は、一つ目はfilename,二つ目はfilename(1)、三つ目はfilename(2)のように名前に(x)のように番号をつける

入力

5 newfile newfile newfolder newfile newfolder

出力

newfile newfile(1) newfolder newfile(2) newfolder(1)

最初に考えた答え

n = gets.to_i
reflected = []

n.times.each do |i|
  name = gets.chop
  count = reflected.select{ |a| a == name }.count

  if count.zero?
    puts name
  else
    puts "#{name}(#{count.to_s})"
  end
  reflected << name
end

nameという変数でファイル名を取得し、配列からselectで同じ名前がないか一つ一つ検証して、countで返す。その後、そのカウントがzeroであればそのまま出力。zeroでなければname(count)で名前を整形して出力とした。その後nameをreflectedに入れる。

これだと時間が入らずTLEが出てた。

n = gets.to_i
count = {}

n.times.each do
  name = gets.chop
  if count[name]
    ans = "#{name}(#{count[name]})"
    count[name] += 1
  else
    ans = name
    count[name] = 1
  end
  puts ans
end

毎回selectで検証するのが時間がかかると思い、countという名前のハッシュを作成。count[ファイル名]で値がないか確認してなければそのまま出力してcount[ファイル名]=1で設定。あればcount[ファイル名]を使用してファイル名を整形して出力。その後count[name]をカウントアップ。

文字列比較がなくなるとこんだけ早くなるんだと勉強なりました。むず。