問題:https://atcoder.jp/contests/abc128/tasks/abc128_b
文字列と数値からなる2次元配列が与えられ、文字列を昇順にソートした上で、同じ文字列の項目内で数値を基準に降順にソートするという問題。
コード例
N=int(input())
S=[list(map(str,input().split())) for _ in range(N)]
for row in S:
row[1]=int(row[1])
SS=sorted(S)
ins=0
ans=list()
tmp=0
for i in SS:
if i[0]==tmp:
ans.insert(ins,i)
else:
ins=len(ans)
ans.append(i)
tmp=i[0]
for j in ans:
print(S.index(j)+1)
標準入力で受け取った後、普通にリストをソートすると各リストの頭から順に昇順でソートされてしまう。
一旦ソートした後(SS)、次に数値を基準に新しいリスト「ans」に並べ直していく。ソートしたリストを頭から順に読み直しながら適切な場所に追加していく。挿入したインデックスを「ins」、tmpに最後に挿入した都市名を保存しておく。
これから挿入しようとする都市名がtmpと一緒なら、すでにデータが「ans」に入力済みなので、降順に並べるためには都市名の並びの一番先頭に追加すれば良い。入れるべきインデックスは「ins」。
もしtmpの値と、今挿入しようとする都市名が異なるならば、都市名がきりかわったということなので、新しい都市名をtmpに保存して、「ans」の末尾にデータを追加する。またその時のインデックスでinsを上書きする。
出力は、for文でansの中の項目について一つ一つ元々のリストのインデックスを参照して出力する。値に+1するのを忘れずに。
今回の入力は、文字列と数値が混ざっていて一発ではうまく入力できなかったため、3,4行目のfor文で数値の部分をintで変換し直した。