公式

A - 招待状の宛名書き / Addressing Wedding Invitations 解説 by admin

Qwen3-Coder-480B

概要

参加者の肩書きに応じて敬称を付け、特定のグループ順に並び替えて出力する問題。

考察

この問題では、参加者を2つのグループに分類し、それぞれのグループ内で元の順序を保ったまま並び替える必要があります。

  • グループA:肩書きが teacher または doctor → 敬称は sensei
  • グループB:肩書きが student または other → 敬称は san

重要なのは、「同じグループ内では入力順を保つ」という条件です。つまり、単純にソートしてしまうと、この順序が崩れる可能性があります。

例えば、次のような入力を考えます:

3
alice student
bob teacher
charlie doctor

このとき、正しくは:

bob sensei
charlie sensei
alice san

となります。bobcharlie はグループAで、alice はグループBです。グループA内では bobcharlie の順で入力されたので、この順番を保つ必要があります。

したがって、以下のように処理するのが良いです:

  1. 入力を順に読み込み、それぞれの参加者をグループAまたはBに振り分ける
  2. グループAのリストの後ろにグループBのリストを連結する
  3. 順に敬称をつけて出力

この方法であれば、各グループ内の順序が維持され、かつ全体としても正しい順序になります。

アルゴリズム

  1. 参加者情報をすべてリストに保存する。
  2. 各参加者の肩書きを見て、グループAまたはグループBに振り分ける。
  3. グループAとグループBを連結して、新しいリストを作る。
  4. 新しいリストの順に、敬称をつけて出力する。

計算量

  • 時間計算量: \(O(N)\)
  • 空間計算量: \(O(N)\)

※ 各要素を一度ずつ見て、リストに追加・連結・出力するだけなので、線形時間で処理可能です。

実装のポイント

  • 各参加者の情報を (名前, 肩書き) のタプルで管理すると扱いやすい。

  • 敬称変換は出力時に行うと、コードがシンプルになる。

  • 入力順を保持するために、リストの append を使い、連結も順序を保つように行うこと。

    ソースコード

N = int(input())
participants = []
for _ in range(N):
    s, r = input().split()
    participants.append((s, r))

group_A = []
group_B = []

for s, r in participants:
    if r in ('teacher', 'doctor'):
        group_A.append((s, r))
    else:
        group_B.append((s, r))

result = group_A + group_B

for s, r in result:
    if r in ('teacher', 'doctor'):
        print(s, 'sensei')
    else:
        print(s, 'san')

この解説は qwen3-coder-480b によって生成されました。

投稿日時:
最終更新: