公式

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] を使います。

アルゴリズム

  1. \(H, W, K\) を読み取ります。
  2. \(H\) 行の文字列を、上から順にリスト rows に保存します。
  3. 各文字列 row から row[k - 1] を取り出します。
  4. 取り出した文字を順につなげ、できた文字列を出力します。

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 によって生成されました。

投稿日時:
最終更新: