Paiza(パイザ)のスキルチェックや競技プログラミングにPythonで挑戦するとき、最初につまずきがちなのが「標準入力(ひょうじゅんにゅうりょく)の受け取り方」です。
「1行のときはできたのに、複数行になったらエラーが出る…」 「大量のデータを読み込んだらタイムアウト(TLE)になってしまった」
そんな悩みを持っていませんか?
この記事では、Paizaの問題を解くために必須となるPythonの標準入力パターンを、コピペで使えるコード付きで徹底解説します。初心者向けに最も効率が良く、実行速度も速い書き方を厳選しました。
これを読めば、入力部分で迷うことはもうなくなります!
なぜ重要?PaizaでPythonの標準入力をマスターすべき理由
Paizaのスキルチェックでは、問題ごとに異なる形式でデータ(文字列や数値)が流れてきます。どれだけロジックが正しくても、入力データを正しく変数に格納できなければ、1点も取ることができません。
また、Pythonの標準的な機能である input() は、データ量が数万行に及ぶと処理が遅くなり、「タイムアウト(時間切れ)」で不合格になる罠があります。
そのため、最初から「エラーが出にくく、処理が高速な書き方」をテンプレ化して覚えておくのが、ランクアップへの一番の近道です。
【準備】Paizaでタイムアウトを防ぐ「高速化コード」
まずは、コードの最上部に必ず記述しておきたい「おまじない」を紹介します。
Python
import sys
input = sys.stdin.read
sys.stdin.read を使うメリット
通常の input() が1行ずつデータを読み込むのに対し、sys.stdin.read はすべての入力データを一度に丸ごと読み込みます。 これにより、データ量が非常に多いDランク後半〜Aランクの問題でも、劇的に実行速度が速くなり、タイムアウトを防ぐことができます。
📌 注意点: この設定をすると、入力データ全体が1つの大きな文字列になります。そのため、ここから紹介する
.split()などのメソッドを使ってデータを分解していくのが基本スタイルになります。
【コピペOK】Paizaでよく出る標準入力パターン6選
ここからは、Paizaで頻出する入力形式ごとのテンプレートコードです。問題の「入力される値」の形式に合わせてコピペして使ってください。
① 1つの整数、または1つの文字列
【入力される値の例】
Plaintext
5
【テンプレートコード】
Python
import sys
# すべて読み込んで整数(int)に変換
n = int(sys.stdin.read())
※文字列としてそのまま受け取りたい場合は、s = sys.stdin.read().strip() と書きます(末尾の改行を消すため)。
② 1行にスペース区切りで並ぶ複数のデータ
【入力される値の例】
Plaintext
10 20 30
【テンプレートコード】
Python
import sys
# ① 文字列のリストとして別々に取得する場合
# 結果:['10', '20', '30']
labels = sys.stdin.read().split()
# ② 決まった数の整数に、それぞれ変数として代入する場合
a, b, c = map(int, sys.stdin.read().split())
③ 1行にスペース区切りで並ぶ大量の数値(リスト化)
【入力される値の例】
Plaintext
1 5 8 12 25 34 ...(大量の数字)
【テンプレートコード】
Python
import sys
# まるごと整数のリスト(配列)に変換する
numbers = list(map(int, sys.stdin.read().split()))
④ 最初に「データ数 N」が与えられ、続く N 行のデータを処理する
PaizaのCランク・Bランクで最もよく見かける、縦にデータが並ぶパターンです。 【入力される値の例】
Plaintext
3
apple
banana
orange
【テンプレートコード】
Python
import sys
# 一気に分割してリストにする
data = sys.stdin.read().split()
n = int(data[0]) # 最初の要素が「行数N」 (3)
words = data[1:] # 2番目以降がデータ本体 (['apple', 'banana', 'orange'])
これだけで、ループを回さず一瞬でデータが取得できます。
⑤ 縦横の2次元グリッド(迷路やマップ、行列データ)
H(行数)とW(列数)が与えられ、その後にグリッド状のデータが続くパターンです。 【入力される値の例】
Plaintext
3 3
1 2 3
4 5 6
7 8 9
【テンプレートコード】
Python
import sys
# 行単位で区切るために splitlines() を使用
lines = sys.stdin.read().splitlines()
# 1行目から H(行数)と W(列数)を取得
h, w = map(int, lines[0].split())
# 2行目以降を2次元配列(リストのリスト)にする
grid = []
for i in range(1, h + 1):
grid.append(list(map(int, lines[i].split())))
# gridの中身: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
⑥ データの行数が事前にわからない(入力の終わりまで読み込む)
問題文に「行数が指定されず、入力が続く限り読み込む」と書かれている場合です。 【入力される値の例】
Plaintext
データ1
データ2
データ3...(どこまで続くか不明)
【テンプレートコード】
Python
import sys
# split() は改行もスペースも全て区切るため、これだけで全てのデータをリスト化できます
all_data = sys.stdin.read().split()
Paizaの標準入力で迷わないためのワンポイント解説
Pythonで標準入力を扱う上で、知っておくと一気にコードが書きやすくなるメソッドの仕様を解説します。
.split()は超万能 引数なしで.split()を使うと、スペースだけでなく改行(\n)やタブもすべて自動で区切って1次元のリストにしてくれます。行の区切りを意識しなくていい問題なら、これが一番シンプルです。- 行を意識したいなら
.splitlines()「○行目の×番目」というように、データの「行」という構造を崩したくない場合は、.splitlines()を使うことで、行ごとの文字列リストを作成できます。
まとめ:標準入力をマスターしてPaizaのランクを上げよう!
Paizaのスキルチェックにおいて、標準入力は「解法を考える前段階の準備」に過ぎません。ここで時間を取られたり、エラーで悩んだりするのは非常にもったいないです。
今回紹介したテンプレートを単語帳やメモ帳に保存しておき、問題に合わせて使い分けられるように練習してみてください。
入力データの扱いがスムーズになれば、アルゴリズムの思考に集中できるようになり、Cランク、Bランク、そしてAランクへの昇格がグッと近づきますよ!


コメント