問題
C# では、IComparer<T> は interface です。Compare メソッドを実装した任意のクラスは、どの要素を先にするかを sort に伝えられます。別の comparer を選ぶと、sort 自体を変えずに順序だけを変えられます。
key で人を並べ替えてください:
name: 名前順(文字の辞書順。大文字は小文字より前になります)、同じ名前なら年齢順。age: 年齢順で若い方が先、同じ年齢なら名前順。
sort_by_key(names, ages, key) を実装してください。
入力
names, ages: 人たちです(同じ長さ)。
key: "name" または "age"。
出力
並べ替えた順の名前を返してください。
制約
0 ≤ 人数 ≤ 100,000
0 ≤ 年齢 ≤ 150
例
例 1
入力:
key = "age"
ages = [30, 36, 30]
names = ["Lin", "Ada", "Bo"]
期待される出力:
expected = ["Bo", "Lin", "Ada"]
入力:
std::string key = "age";
std::vector<long long> ages = {30, 36, 30};
std::vector<std::string> names = {"Lin", "Ada", "Bo"};
期待される出力:
std::vector<std::string> expected = {"Bo", "Lin", "Ada"};
入力:
string key = "age";
long[] ages = new long[] {30, 36, 30};
string[] names = new string[] {"Lin", "Ada", "Bo"};
期待される出力:
string[] expected = new string[] {"Bo", "Lin", "Ada"};
解説
Bo と Lin はどちらも 30 なので、Ada (36) の前で名前順に並びます: ["Bo", "Lin", "Ada"].
例 2
入力:
key = "name"
ages = [30, 36, 30]
names = ["Lin", "Ada", "Bo"]
期待される出力:
expected = ["Ada", "Bo", "Lin"]
入力:
std::string key = "name";
std::vector<long long> ages = {30, 36, 30};
std::vector<std::string> names = {"Lin", "Ada", "Bo"};
期待される出力:
std::vector<std::string> expected = {"Ada", "Bo", "Lin"};
入力:
string key = "name";
long[] ages = new long[] {30, 36, 30};
string[] names = new string[] {"Lin", "Ada", "Bo"};
期待される出力:
string[] expected = new string[] {"Ada", "Bo", "Lin"};
解説
アルファベット順: ["Ada", "Bo", "Lin"].
解き方のヒント
まずは自分で考えてから、ヒントを 1 つずつ開いてみましょう。
ヒント 1
2 つの別々のリストではなく (name, age) の組を並べ替えます。
ヒント 2
選んだキーが主な順序を決め、もう一方が同順位を決めます。
ヒント 3
文字コード順で比べると、大文字が小文字より先になります。
目安の計算量
時間 O(n log n)、追加メモリ O(n)
参考資料
この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。