AtCoder ABC 128 B – Guidebook Python解説

スポンサーリンク

Guidebook

あなたは美味しいレストランを紹介する本を書くことにしました。 あなたは N 個のレストラン、レストラン 1、レストラン 2……、レストラン N を紹介しようとしています。レストラン i は Si 市にあり、あなたは 100 点満点中 Pi 点と評価しています。
異なる 2 個のレストランに同じ点数がついていることはありません。

この本では、次のような順でレストランを紹介しようとしています。市名が辞書順で早いものから紹介していく。
同じ市に複数レストランがある場合は、点数が高いものから紹介していく。

この本で紹介される順にレストランの番号を出力してください。

AtCoder Beginner Contest 「Guidebook」

今回の問題は市名が辞書順で早いもの、同じ市に複数レストランがある場合は点数が高い順という、昇順と降順の2つのソートを使わないといけないので難易度が高くなっています。

Pythonで実装するにはソート内でlambda関数を使うとよいでしょう。lambda関数を使って市名は昇順、点数は降順になるようにします。

n = int(input())

a = []

for _ in range(n):
    s, p = input().split()
    a.append((s, int(p)))
b = sorted(a, key=lambda x: (x[0], -x[1]))
    
for i in b:
    print(a.index(i) + 1)

最後にレストランの番号を出力したいので配列aはソートせずに残しています。
lambda関数を使って昇順と降順にソートしたら、配列aのレストラン番号と照会して完了です。