チャレンジ一覧に戻る
簡単 0件解決済み 正答率0%

選んだキーで並べ替え

実行時に選んだ比較器で、名前または年齢順に人を並べ替え、同順位は一貫した方法で解消します。

このチャレンジで学べること

  • 実行時に並べ替えの順を選ぶ
  • 第 2 のキーで同順位を決める
  • 文字列を文字コード順で比べる

問題

原文(英語)を表示

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用に調整されています。上記の説明と制約に従ってください。

他の人の解答から学ぶ

コミュニティの解答

まだ公開された解答がありません。この課題を解いて最初の解答を共有しましょう。