競技プログラミング

ABC304 A – First Player

https://atcoder.jp/contests/abc304/tasks/abc304_a

イントロダクション

今日解説する問題は、N人の人々が円卓に座っていて、それぞれの人が異なる名前と年齢を持っているというシチュエーションです。タスクは、最も若い人から始めて、時計回りに座っている全員の名前を出力することです。

問題の詳細説明

円卓に座っている人々は人1から人Nまで番号付けされ、時計回りに並んでいます。異なる2人が同じ名前や同じ年齢であることはありません。最も若い人を起点として、座っている位置の時計回りの順に、全員の名前を出力する必要があります。

問題の要素解説

この問題の鍵となる要素は次のとおりです:

  1. 人々は時計回りに円卓に座っている。
  2. 各人は一意の名前と年齢を持っている。
  3. 最も若い人から始めて、時計回りに座っている全員の名前を出力する。

解答戦略

  1. まず、各人の名前と年齢を保持するデータ構造(例えば、辞書やタプルのリスト)を作成します。
  2. 次に、最も若い人を見つけます。これは年齢を比較することで達成できます。
  3. 最後に、最も若い人から始めて時計回りに全員の名前を出力します。これはリストのスライスと結合を使用して実現できます。

コードの解説

以下に、Swiftで書かれた解答のコードを示します。このコードは上述の解答戦略を実装しています。

let N = Int(readLine()!)!
var persons = [(name: String, age: Int)]()
for _ in 0..<N {
    let input = readLine()!.split(separator: " ")
    let name = String(input[0])
    let age = Int(input[1])!
    persons.append((name: name, age: age))
}

let sortedPersons = persons.sorted { $0.age < $1.age }
let youngest = sortedPersons.first!
let index = persons.firstIndex { $0.name == youngest.name && $0.age == youngest.age }!
let result = persons[index...] + persons[..<index]

result.forEach { print($0.name) }

テストケースと実行結果

入力:

5
alice 31
bob 41
carol 5
dave 92
ellen 65

出力:

carol
dave
ellen
alice
bob

考察と最適化

この問題は基本的なデータ構造の操作を用いて解くことができます。最も若い人を見つけ、その人から時計回りに名前を出力するという要求は、配列のインデックス操作とソート操作を組み合わせて解くことができます。この問題の制約(2≤N≤100)は非常に小さいため、この解答戦略は十分効率的です。

結論

この問題は、データのソートとインデックス操作の基本的な知識を用いて解くことができます。この問題の解答戦略とコードが、円卓に座る人々の名前を適切な順序で出力するための方法を理解するのに役立つことを願っています。

コメントとフィードバックの募集

皆さんからのフィードバックや質問があれば、ぜひコメントしてください。この解説が皆さんの理解を深めるのに役立つことを願っています。また、他の解答戦略や最適化のアイデアがあれば、それらを共有してください。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です