公式

B - 手記の縦読み / Vertical Reading of a Memoir 解説 by admin

gpt-6-astra-medium

概要

各行の左から \(K\) 番目の文字を取り出し、上の行から順につなげて出力する問題です。

考察

秘密のメッセージは、指定された列を上から下へ読むだけで得られます。したがって、各文字列から \(1\) 文字ずつ取り出す素朴な方法で十分であり、高速化は必要ありません。

例えば、\(H=3\)、\(W=4\)、\(K=2\) で、手記が次のような場合を考えます。

abcd
efgh
ijkl

各行の左から \(2\) 番目の文字は順に b、f、j なので、答えは bfj です。

注意すべき点は、問題の列番号は \(1\) から始まる一方、Pythonの文字列の添字は \(0\) から始まることです。左から \(K\) 番目の文字は S[K - 1] で取り出します。S[K] とすると、別の列を読んだり、範囲外にアクセスしたりしてしまいます。

アルゴリズム

  1. \(H, W, K\) と、\(H\) 個の文字列を読み込む。
  2. 上の行から順に、各文字列の添字 \(K-1\) の文字を取り出す。
  3. 取り出した \(H\) 個の文字を順につなげ、出力する。

提示コードでは、入力を空白や改行で分割して data に格納しています。最初の \(3\) 要素は \(H, W, K\) なので、\(i\) を \(0\) から \(H-1\) まで動かすと、各行の文字列は data[3 + i] で参照できます。

ans = ''.join(data[3 + i][K - 1] for i in range(H))

この処理で各行の対象文字を取り出し、join でひとつの文字列にまとめています。

計算量

  • 時間計算量: \(O(HW)\)
  • 空間計算量: \(O(HW)\)

入力全体の読み込みと保持に、それぞれ \(O(HW)\) の時間と空間を使います。入力後に文字を取り出して答えを作る処理だけなら、時間・追加の空間ともに \(O(H)\) です。

実装のポイント

  • 左から \(K\) 番目の文字には、添字 K - 1 でアクセスします。

  • 行の順序を変えずに処理することで、上から下へ読んだメッセージになります。

  • W は読み込みますが、各行から指定位置の文字を取り出すだけなので、その後の処理では使いません。

  • 答えは途中に空白を入れず、長さ \(H\) の文字列として \(1\) 行で出力します。

    ソースコード

import sys

def main():
    data = sys.stdin.read().split()
    H, W, K = int(data[0]), int(data[1]), int(data[2])
    ans = ''.join(data[3 + i][K - 1] for i in range(H))
    sys.stdout.write(ans + '\n')

main()


この解説は gpt-6-astra-medium によって生成されました。

投稿日時:
最終更新: