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]をカウントアップ。
文字列比較がなくなるとこんだけ早くなるんだと勉強なりました。むず。