Official
A - 星空の観測記録 / Starry Sky Observation Log Editorial by admin
GPT 5.2 High概要
\(H \times W\) のグリッドから T(星)があるマスをすべて見つけ、座標 \((行, 列)\) を上から順・左から順に列挙して出力する問題です。
考察
- 各マスは
.かTのどちらかなので、「全マスを一度ずつ見てTを見つける」だけで十分です。 - 出力順は「行番号が小さい順、同じ行なら列番号が小さい順」ですが、グリッドを上の行から順に、各行を左から順に走査すれば、その走査順=要求される出力順になります。したがって、後からソートする必要はありません。
- 素朴に「
Tの位置を集めて最後にソートする」方法でも正解はできますが、ソートに \(O(K \log K)\) かかり不要です(\(K\) は星の数)。今回は走査順にそのまま出せるため、よりシンプルに \(O(HW)\) で処理できます。 - 出力形式上、最初に星の総数 \(K\) を出す必要があります。そのため、
- 先に全体を数える(1回目の走査)→ \(K\) を出力
- もう一度走査して座標を出力(2回目の走査)
という形にすると実装が簡単です。
例:
なら、走査順に (1,2), (2,1), (2,2) と出せば条件通りです。.T. TT.
アルゴリズム
- 入力として文字列配列 \(S_1 \ldots S_H\) を受け取る。
- 各行の
Tの個数を数えて合計し、星の総数 \(K\) を求めて出力する。 - \(r=1..H\) の順に各行を、さらに \(c=1..W\) の順に各文字を調べる。
- \(S_r[c]\) が
Tなら、その座標 \((r, c)\) を出力する。
(この走査順がそのまま要求される出力順になる。)
計算量
- 時間計算量: \(O(HW)\)(全マスを定数回見るだけ)
- 空間計算量: \(O(HW)\)(入力グリッドを保持する分)
実装のポイント
座標は \((1,1)\) 始まりなので、
enumerate(..., 1)を使うとミスが減ります。\(H, W \le 1000\) なので最大 \(10^6\) マスを扱います。Pythonでは
sys.stdin.readlineを使って高速に読み込み、出力もsys.stdout.writeを使うと安心です。1行目に \(K\) を出す必要があるため、先に
count('T')で合計を求めてから座標を列挙しています。ソースコード
import sys
def main():
input = sys.stdin.readline
H, W = map(int, input().split())
S = [input().rstrip('\n') for _ in range(H)]
K = sum(row.count('T') for row in S)
out = sys.stdout.write
out(str(K) + "\n")
for r, row in enumerate(S, 1):
for c, ch in enumerate(row, 1):
if ch == 'T':
out(f"{r} {c}\n")
if __name__ == "__main__":
main()
この解説は gpt-5.2-high によって生成されました。
posted:
last update: