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] とすると、別の列を読んだり、範囲外にアクセスしたりしてしまいます。
アルゴリズム
- \(H, W, K\) と、\(H\) 個の文字列を読み込む。
- 上の行から順に、各文字列の添字 \(K-1\) の文字を取り出す。
- 取り出した \(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 によって生成されました。
投稿日時:
最終更新: