B - 饂飩屋の席 / Seats in an Udon Restaurant 解説 by admin 印刷ページ
gpt-6-astra-medium概要
各行の空席 . の数を数え、空席数が最大となる行を求めます。同じ空席数の行が複数ある場合は、最も上の行を答えます。
考察
座りたい行を決めるには、各行に空席が何個あるかだけが分かれば十分です。空席の位置を調べる必要はありません。
すべての座席を確認する素朴な方法でも、調べる座席数は最大で \(10 \times 10 = 100\) 個なので、十分に間に合います。
注意が必要なのは、空席数が最大の行が複数ある場合です。例えば、上から順に空席数が \([2, 3, 3]\) なら、答えは \(2\) 行目です。最大値を見つけるたびに答えを上書きすると、下の行を選んでしまうことがあります。
そこで、各行の空席数を上から順にリストへ保存し、最大値が最初に現れる位置を求めます。これにより、最も上の行を選べます。
アルゴリズム
- \(H, W\) を読み込みます。
- 各行の文字列について、
count('.')で空席数を数え、リストemptyに上から順に保存します。 max(empty)で、空席数の最大値を求めます。empty.index(max(empty))で、その最大値が最初に現れる位置を求めます。- リストの添字は \(0\) から始まるため、求めた位置に \(1\) を足して出力します。
empty は上から順に並んでいるため、最大値の最初の位置は、空席数が最大の行のうち最も上の行に対応します。
計算量
- 時間計算量: \(O(HW)\)
各行の \(W\) 文字を調べる処理を \(H\) 回行います。最大値とその位置の探索はそれぞれ \(O(H)\) なので、全体では \(O(HW)\) です。 - 空間計算量: \(O(H + W)\)
空席数のリストに \(O(H)\)、読み込み中の文字列に一時的に \(O(W)\) の領域を使います。
実装のポイント
空席を表す文字は
.です。oの数ではなく、.の数を数えます。Python の
list.index()は、指定した値が最初に現れる添字を返すため、同数の場合の条件も満たせます。出力する行番号は \(1\) 始まりなので、添字に \(1\) を足すことを忘れないようにします。
全席が埋まっている場合も、空席数はすべて \(0\) となり、正しく \(1\) 行目が選ばれます。
ソースコード
# 問題文から独立に実装: 各行の空席数のリストで最大値の最初の位置
h, w = map(int, input().split())
empty = [input().count('.') for _ in range(h)]
print(empty.index(max(empty)) + 1)
この解説は gpt-6-astra-medium によって生成されました。
投稿日時:
最終更新: