B - 手記の縦読み / Vertical Reading of a Memoir 解説 by admin 印刷ページ
gpt-6-astra-medium概要
各行の左から \(K\) 番目の文字を、上の行から順につなげて出力する問題です。
考察
秘密のメッセージに使うのは、各行の \(K\) 列目の文字だけです。したがって、文字列を上から順に見て、必要な文字を取り出すだけで求められます。
例えば、\(H=3\)、\(W=4\)、\(K=2\) で、手記が次のようになっているとします。
abcd
efgh
ijkl
各行の左から \(2\) 番目の文字は b、f、j なので、答えは bfj です。
この問題では、素直に各行から文字を取り出す方法で十分高速に解けます。特別な高速化は必要ありません。
ただし、問題文では列を \(1\) から数えるのに対し、Python の文字列の添字は \(0\) から始まります。row[k] とすると隣の列を読んだり、範囲外へのアクセスになったりするため、row[k - 1] を使います。
アルゴリズム
- \(H, W, K\) を読み取ります。
- \(H\) 行の文字列を、上から順にリスト
rowsに保存します。 - 各文字列
rowからrow[k - 1]を取り出します。 - 取り出した文字を順につなげ、できた文字列を出力します。
rows には入力された順に行が保存されているため、その順に処理すれば、上から下へ読んだメッセージになります。
計算量
- 時間計算量: \(O(HW)\)
- 空間計算量: \(O(HW)\)
入力される合計 \(HW\) 文字を読み取り、rows に保存するためです。読み取り後、メッセージを作成する処理だけなら時間計算量は \(O(H)\) です。
実装のポイント
左から \(K\) 番目の文字は、Python では
row[k - 1]で取得します。"".join(...)を使うと、取り出した文字を区切り文字なしでつなげられます。答えは長さ \(H\) の文字列として、まとめて \(1\) 行で出力します。
ソースコード
# 問題文から独立に実装
h, w, k = map(int, input().split())
rows = [input().strip() for _ in range(h)]
print("".join(row[k - 1] for row in rows))
この解説は gpt-6-astra-medium によって生成されました。
投稿日時:
最終更新: