##はじめに
こんにちは。皆さん精進頑張ってますか?最近競技プログラミングが熱いですね。僕も最近始めたのでそんな強くはないのですが、「競技プログラミングはC++だ!」っていう風潮が結構あってPython使いとしては肩身の狭い思いをしてしまいますよね。
そこで、「Pythonで競技プログラミングを始めてみよう!」というかっちょいい人とか、慣れてる人でも「こういう時どうやって受け取るんだっけ?」ってなってしまう人向けに僕が記事を書いて、Python使って競プロやる仲間を増やせたらなあと思って記事を書いてみました。
今回は初歩の初歩、入出力についてです。今後もテーマが決まればどんどん記事を追加していくつもりです。
###概要
Pythonでの入出力
整数入力編
実数出力編
文字列入力編
文字列出力編
##Pythonでの入出力
では、早速ですがPythonでの入出力方法についてまとめていきます。
##整数入力編
競プロでは、整数の受け取りを求められることはかなり多いですが、小数の受け取りを求められることは少ないので、ここでは整数の入力に限定して書いていきます。
###形式
N # Nは整数
###入力例
1000000007
まずは単純な整数Nを受け取ってみましょう。これは以下のように書くのが一般的です。
###入力実装例
N = int(input()) #Nに1000000007が代入されている。
#print(N) -> 1000000007
次に、複数の整数を受け取ってみましょう。
###形式
A B C #A, B, C はそれぞれ整数
###入力例
1 2 3
これは以下のようにmapを使うと簡単にかけるので覚えておきましょう。
###入力実装例
A, B, C = map(int, input().split()) #A = 1, B = 2, C = 3が代入されている。
次に、以下のような配列を受け取ってみましょう。
###形式
a1 a2 ... an #aiは全て整数
###入力例
0 1 ... 99 #ai = i が代入されている。
これはlistと先ほどのmapで受け取りましょう。
###入力実装例
a = list(map(int,input().split()))
次に、入力形式が縦に並んでいる場合はどうしましょう?
###形式
a
b
c
d
e
###入力例
1
2
3
4
5
このようなものは、以下のようにint(input())を5回行っても良いですが、
###入力実装例1
a = int(input())
b = int(input())
c = int(input())
d = int(input())
e = int(input())
これはちょっとばかし面倒臭いので、以下のように簡単にかけることを覚えておきましょう。
###入力実装例2
a, b, c, d, e = [int(input()) for i in range(5)] #5は要素数に応じて変更してください。
今までは数字が横方向もしくは縦方向にしか並んでいませんでしたが、以下のように平面状にある場合はどうしましょうか?
###形式
N #Nは整数
#ai, bi は全て整数
a1 b1
a2 b2
...
aN bN
###入力例
10
3 1
4 1
...
8 4
これは、問題に応じて受け取り方を考えます。
基本的にfor文を回して受け取るのが一般的かと思われますが、受け取った数値をそのループ内で計算して出力できるのか、それとも一旦配列として受け取っておいて全部受け取った後に何か計算してその結果を出力する必要があるのかを考えます。
前者の場合は、
###入力実装例1
N = int(input())
for i in range(N):
a, b = map(int, input().split()) #aとbの値はfor文が回るごとに更新される。
# ここでaとbに関する何らかの処理を行う。
#(print()で、出力を行う。) <-なくても良いが、結構の場合ある。
のようにmapを使います。
後者のように、for文で受け取った後に配列として値を保持しておく必要がある場合は
###入力実装例2
N = int(input())
a = [0] * N #長さNの配列を作る。値は0で初期化。
b = [0] * N
for i in range(N):
a[i], b[i] = map(int, input().split()) #aとbの配列として保持される。
# for文を出たら配列a,bに対して何か操作を行って出力を行う。
最後に、二次元配列を受け取ってみましょう。今まで学んだ入力方法を覚えていれば以下のような入力形式でも不安になることはありません。
###形式
N M # N, Mは整数
a1,1 a1,2 ... a1,N
a2,1 a2,2 ... a2,N
. . .
. . .
. .
aM,1 aM,2 ... aM,N
###入力例
3 2
1 2 3
4 5 6
これは以下のようにlistで二次元配列として受け取りましょう。
###入力実装例
N, M = map(int, input().split())
a = [list(map(int, input().split())) for i in range(M)]
ここで、よく分からない人はリスト内包表記について調べておきましょう。簡単に説明すると、
list(map(int, input().split()))
という配列をM回受け取って全体としてさらに配列にしています。
[[a1,1 a1,2 ... a1,N],
[a2,1 a2,2 ... a2,N],
...
[aM,1 aM,2 ... aM,N]]
というように受け取っています。
以上で整数の入力方法については終わりです。
##実数出力編
正直整数の入力で山場は超えてしまったので、後はそんなに書くことはないです。
通常答えを一つ出力する時は、
###形式
ans = 2.71828 #ansは実数
のように、一つだけ数値を出力することが多いので、
###出力実装例
print(ans)
###出力例
2.71828
のように書けばいいです。
正直これ以上書く内容が思い浮かばないので、次は文字の入出力に移りたいと思います。
##文字列入力編
文字列を受け取る場合は、ますぞれをリストとして受け取った方が良いのか、リストとして受け取る必要なんてないのかを考えます。
###形式
S # Sは文字列
###入力例
chokudai
リストとして受け取らない場合は、
###入力実装例1
S = input()
とします。
しかし、あくまで僕の主観ですが、大体の場合において文字列は配列として受け取った方が良いと思います。その場合は、以下のようにリストとして受け取りましょう。
###入力実装例2
S = list(input()) #整数の時とは違い、今回は受け取った文字をmapで数値型に変換する必要がない。
###入力例
AtCoDeer
こうすると、以下のようにリストで1文字ずつ保持されます。
# S = ['A', 't', 'C', 'o', 'D', 'e', 'e', 'r']
以上で文字列の入力方法を終わります。後は、基本的に整数型で紹介した受け取り方と組み合わせれば受け取れますので、自分で試してみてください。
##文字列出力編
最後になりました。これが終わればあなたももう競技プログラミングにPythonで参加しても入出力で困ることはまずありません。もう少し頑張りましょう!
###形式
S = 'AtCoDeer'
を出力する場合は単純に、
###出力実装例1
print(S)
###出力例
AtCoDeer
とします。
応用例として、
'reeDoCtA'
と逆順に出力したい場合は、
###出力実装例2
print(S[::-1]) #'reeDoCtA'と出力
とできます。
次に、先ほど文字列入力編にて、「文字列を受け取る時はリストが便利だ!」のようなことを言いましたが、
###形式
'abc' # S = ['a', 'b', 'c']
のように、リストになっている各要素を連結させて文字列に変換する方法について述べていません。
それは以下のようにjoinを使いましょう。
###出力実装例1
print(''.join(S))
###出力例
abc
もしabcの間にスペースをいれたい場合は、以下のように
###出力実装例2
print(' '.join(S))
###出力例
a b c
と''にスペースを入れれば実現できます。他にも
###出力実装例3
print('/'.join(S))
###出力例
a/b/c
のようにもできますね。
次で最後です。最後もう一踏ん張りしましょう。
次は、実際に競プロで出力が求められることはそんなにないですが、個人的にデバッグなどで重宝すると思っている書き方です。
###形式
'aaaaaaaa123'
のように
数値と文字が混在している場合にどのように出力するべきかを学びましょう。
###出力実装例
i = 123
print('aaaaaaaa'.format(i)) # 'aaaaaaaa123'
のように、formatを使いましょう。
##終わりに
いかがでしたでしょうか。Pythonで競技プログラミングをやっている人はそんなに多くはないですが、Pythonというメジャーな言語を使っている人も多いのではないかと思います。
この記事を機に「Pythonで競プロやってみよう!」とか、「入出力方法で不安に思うことはなくなった!」って思ってくれる人が出てきてくれるのを願っています。
さあ、みんなも精進しよう!!!