公式
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
となります。bob と charlie はグループAで、alice はグループBです。グループA内では bob → charlie の順で入力されたので、この順番を保つ必要があります。
したがって、以下のように処理するのが良いです:
- 入力を順に読み込み、それぞれの参加者をグループAまたはBに振り分ける
- グループAのリストの後ろにグループBのリストを連結する
- 順に敬称をつけて出力
この方法であれば、各グループ内の順序が維持され、かつ全体としても正しい順序になります。
アルゴリズム
- 参加者情報をすべてリストに保存する。
- 各参加者の肩書きを見て、グループAまたはグループBに振り分ける。
- グループAとグループBを連結して、新しいリストを作る。
- 新しいリストの順に、敬称をつけて出力する。
計算量
- 時間計算量: \(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 によって生成されました。
投稿日時:
最終更新: