※コメントにてアドバイスをいただき、入力方法は2つに集約できることが判明したので加筆しました。
2020年8月22日に競技プログラミングにPythonでデビューを果たしました。
参加したのは、日本で競技プログラミングといえばまっさきに思い浮かぶAtCoderです。
新しく学び始めたPythonをようと、実際にはその前に会員登録して、始める準備万端でした。
過去問を解いた時に??ってなってしまい、心の物置部屋にそっとAtCoderに登録したことをおいてきていました。
なぜ競技プログラミングに取り組めなかったのか?
その理由はシンプルです。
そもそもPythonでの標準入力の部分で躓いたからorz
もちろんそれまでにPythonの入門書も読破していたので、入力方法についてもinput使えばいいことはわかっていました。
しかし、inputに関する理解が圧倒的に足りていませんでした。
Python入門書で扱うinputといえば
inputっていえば、Python入門書で環境セットアップ後の1,2章のところで登場します。
サンプルコードは控えますが、だいたいこんなアウトプットになるサンプルコードが掲載されています。
$:テキストを入力してね!:○○
$:こんにちは!○○
その後の章に進んでも、inputの様々な使い方を学ぶよりも、他の内容についての勉強にいきがちです。
その結果、inputについてわかっても、理解にまでは至っていなかったです。
それを競技プログラミングにチャレンジして思い知らされました。
あっという間に頭がフリーズし、AtCoderのタブを閉じてしまいました・・・
過去問を解いて分かった覚えるべき2つのinputの使い方
※素晴らしいアドバイスを受け3つ→2つに修正しました。
そんな中、きちんとコードを書く機会を増やしたことで、再び競技プログラミングに挑もうという意欲が湧いてきたので、AtCoderに再度舞い戻ってきました。
「今回は俺わからなくても、フリーズせずにググろうと思うんだ」
という決意の元、入力の方法からしっかり調べてみたところ、A,B問題はクリアできるようになりました。
C問題は、計算量O(N^2)に苦戦し、制限時間をオーバー「TLE」の壁に苦しみます…
そんな中、自分が躓いて投げ出してしまった導入部分の「標準入力」は主に以下の2つに集約されることが判明しました。
1つの整数を入力
a = int(input())
1行で入力する整数が1個のパターンです。2020年8月22日のAtCoder Beginner Contest 176のB問題がこのパターンでした。
ただ、1つの整数だけを入力するというケースは少なく、基本的に後述する2つのパターンと組み合わせて出題されるケースが多いです。
##複数個の整数またはリストとして整数を入力
a,b,c = [int(e) for e in input().split()]
A = [int(e) for e in input().split()]
複数個の変数に入力、または入力する数が決まっていない場合に、入力した整数をリストに格納します。
1行で整数を複数入力する際には、スペースで区切るため、分割できるようにsplit()が組み込まれています。
リスト内包表記というPythonの記法によって、入力した個数分だけ値を格納することができます。
複数個になるパターンはAtCoder Beginner Contest 176のA問題がこのパターンでした。
また、AtCoder Beginner Contest 176のC問題が1個の整数入力と、リストによる整数入力を組み合わせた形でした。
※元々は複数個の変数とリストでの整数入力は別の方法を紹介していましたが、コメントにて2つの方法はリスト内包表記によって統一できるとアドバイスいただきました。
この2つの入力方法を覚えれば、競技プログラミングの最初のつまづきポイントである標準入力を回避することができます。
もちろん、他にも色々な入力形式がありますが、あまり追求すると、頭がオーバーヒートします。
覚えられないと高らかに宣言することも大切です。
まとめ・終わりに
競技プログラミングで最初のつまづき「標準入力」は以下の2つコードで回避
# 1つの整数を入力
a = int(input())
# 複数個の整数を入力
a,b,c = [int(e) for e in input().split()]
# リストとして整数を入力
A = [int(e) for e in input().split()]
A問題、B問題が解けると競技プログラミングへの意欲が湧いてきます!