競技プログラミングと標準入力
最近、競技プログラミング(AtCoder)というものを始めてみた。
競技プログラミングでは標準入力で課題を受け取り、処理したものを標準出力で渡すわけだが、標準出力はともかく標準入力は普段のプログラムではめったに使わない。
で、いつもやり方を忘れ、「python 標準入力 競プロ」とggってしまうので備忘録代わりに残しておく。
また、初投稿なので不備等あるかもしれない。
あと、paizaでも使えると思う。
どうでもいいが標準入力だけで見るとC++の方が数倍楽な気がする。勝手に型変わらないし。
環境
python 3.5
paiza.ioで動作を確認
出力はコメントで記入
入力が1行かつ区切りなしの場合
入力
入力は以下の形式で標準入力から与えられる。
N
入力例
20
みたいに書かれている場合や、
入力
入力は以下の形式で標準入力から与えられる。
S
入力例
atcoder
の場合、
# Stringの場合
S = input() # ここで標準入力
# 出力して確認
print (type(S), S) # <class 'str'> atcoder
# intの場合
N = int(input()) # ここで標準入力
# 出力して確認
print (type(N), N) # <class 'int'> 20
で対応する。
この場合、入力が数字でも型がStringになってしまう。
なのでint()でキャストする。
##入力が1行で区切りありの場合
入力
入力は以下の形式で標準入力から与えられる。
L R
入力例
12 34
こういった場合の対応。
それぞれに変数名を与えたい時
# Stringの場合
L, R = input().split()
# 出力して確認
print(type(L), L, R) # <class 'str'> 12 34
# intの場合
L, R = map(int,input().split())
# 出力して確認
print(type(L), L, R)
# <class 'int'> 12 34
mapを使うことでintで入力でき、それぞれ変数名を与えられる。
普段はこれ。
List にしたい時
# Stringの場合
lst1 = input().split()
# 出力して確認
print(type(lst1),lst1) # <class 'list'> ['12','34']
print(type(lst[0]),lst[0]) # <class 'str'> 12
# intの場合
lst2 = list(map(int, input().split()))
# 出力して確認
print(type(lst2), lst2) # <class 'list'> [12, 34]
print(type(lst2[0]), lst2[0]) # <class 'int'> 12
入力される数が不定の場合は役に立つ、かも。
タプルにしたい時
# Stringの場合
lst3 = tuple(input().split())
# 出力して確認
print(type(lst3), lst3) # <class 'tuple'> ('12', '34')
# intの場合
lst4 = tuple(map(int,input().split()))
# 出力して確認
print(type(lst4), lst4) # <class 'tuple'> (12, 34)
タプルの方が処理速度が早い。
ただ、中身の変更が不可能になる。
複数行の入力
###事前に入力される行数がわかる時
AtCoder Beginner Contest 113 C : ID
みたいに
入力
入力は以下の形式で標準入力から与えられる。
N M # Nが列,Mが行
P1 Y1
:
PM YM
>#### 入力例
>```
2 3
1 32
2 63
1 12
こういった場合の対応。
1行目に入力される文字数が分かる場合は
N, M = map(int, input().split())
P = [input().split() for i in range(M)]
# 出力して確認
print(type(P), P) # <class 'list'> [['1', '32'], ['2', '63'], ['1', '12']]
言うまでもなく、入った文字は文字列。
N, M = map(int,input().split())
P = [list(map(int,input().split())) for i in range(M)]
# 出力して確認
print(type(P), P) # <class 'list'> [[1, 32], [2, 63], [1, 12]]
これならintになる。listをtupleにすればタプルになる
(当たり前といえば当たり前だが)
##おまけ
変数名のつけかた
通常、変数名は小文字にすべきだが、競技プログラミングでは上記でも用いたように、入力に示された変数名をそのまま用いる人が多い。
理由は単純にわかりやすいからだと思うが、自分で変数を作る場合はわかりやすい変数名かつ言語仕様に従うべき。 1
入力の処理速度を高速化
Pythonの知っておくと良い細かい処理速度の違い8個
によると
標準入力はinput()よりsys.stdin.readline()の方が10倍速い
とのこと。
import sys
input = sys.stdin.readline
で利用可能なので覚えておくと役に立つのではないか。
##参考にしたサイト
-
安易にtmpとかつけてわけがわからなくなるのはよくある話 ↩