くろたんく雑記帳

日常とか、わんちゃんとか、機械学習とか、競プロとか、

MENU

Pythonで競プロをはじめるにあたって(基本入出力編)

はじめに

ローカルでサンプルのテスト環境の準備は以前行った。

blacktanktop.hatenablog.com

ただ、実際に競技プログラミングのコードを始めて、一番最初に戸惑ったのは

  • 標準入力からデータを受け取ること

  • 答えができたけどうまく出力する必要があること

基本的な受け取りができるのが大前提で、いい感じに受け取った方がいい場合などもあるということがわかってきた。

そのためそれらをまとめる。



やりたいこと

基本的な入出力のまとめ

Pythonでやっている方はたくさんいるので、すでにまとまっている記事はたくさんあるが自分用にまとめる


扱わないこと

  • Pythonの環境周りのこと
  • sys.stdinを使う方法

対象


前提

Python3を使う。

入力方式はinput()をベースで行う。

他にはスピードも早いsys.stdinを使う方法があるが、一旦ここでは扱わない。

基本的に複数行ある場合は上から順番に欲しいように取得して行くイメージで考えておけばよい。


基本

  • input()とすると標準入力を文字列として受け取る
# 標準入力
1
n = input()
# n
# '1'
  • input().split()とすると半角スペースで区切ってリストとして受け取る
# 標準入力
1 2 3 4
n = input().split()
# n
# ['1', '2', '3', '4']
  • リストは要素数分受け取る変数を用意すれば要素をそれぞれ受け取ることができる
n, m = ['3', '4']
# n
# 3
# m
# 4
  • mapはmap(a, b) はbに対してaしたものを返す

aは組み込み関数・自作関数・lambda式でも使える。bはリストやタプル。

基本的な入力ではintをつかうことが多い。(input()は文字列として読み込むので)

map関数が返すのはmap型であるため直接見るにはlist()する

ここまでわかっていればあとは組み合わせ


入力(整数)

1行1列
# 標準入力例
# n

1
n = int(input())
# n
# 1
1行複数列
# 標準入力例
# n m

3 4 
# 複数変数で受け取る場合
n, m = map(int, input().split())
# n
# 3
# m
# 4
# 標準入力例
# a1 a2 a3 a4

1 2 3 4 
# 1変数でリストで受け取る場合
a = list(map(int, input().split()))
# リスト内包表記でやるなら
a = [int(x) for x in input().split()]
# a
# [1, 2, 3, 4]
複数行1列
# 標準入力例
# n
# a1
# b1
# c1
# d1

4
1
2
3
4
# 複数変数でリストで受け取る場合
# 1行1列を繰り返せばいい
n = int(input())
a = int(input())
b = int(input())
c = int(input())
d = int(input())

# 1変数でリストで受け取る場合
# リスト内包表記
n = int(input())
x = [int(input()) for _ in range(n)]
# x
# [1, 2, 3, 4]
複数行複数列
# 標準入力例
n m
a1 a2 a3 a4
b1 b2 b3 b4
c1 c2 c3 c4

3 4
1 2 3 4
5 6 7 8
9 10 11 12
# 複数変数でそれぞれ受け取る場合
# 1行複数列を繰り返せばいい
n, m = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
c = list(map(int, input().split()))
 
# 1変数でリストで受け取る場合
n, m = map(int, input().split())
x = [list(map(int, input().split())) for _ in range(n)]
# x
# [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

入力(文字列)

1行1列
# 標準入力例
abcdefghijklmn
# そのまま
s = input()
# s
# 'abcdefghijklmn'

# 1文字ずつリストにしたい場合
s = list(input())
# s
# ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']
1行複数列
# 標準入力例
ab cd ef gh
# 複数変数で受け取る場合
s, t, u, v = input().split()
# s
# 'ab'
# t
# 'cd'
# u
# 'ef'
# v
# 'gh'
# 1変数でリストで受け取る場合
# こんな風に受け取る必要があることはほぼない
s = list(input().split())
# s
# ['ab', 'cd', 'ef', 'gh']
複数行1列

こんな風に受け取る必要があることはほぼない

# 標準入力例
4
a
b
c
d
# 複数変数で受け取る場合
# 1行1列を繰り返せばよい
n = int(input())
s = input()
t = input()
u = input()
v = input()

# 1変数でリストで受け取る場合
n = int(input())
# リスト内包表記
s = [input() for i in range(n)]
追記:こっちの方がいいと思う。
s = [input() for _ in range(n)]
# s
#  ['a', 'b', 'c', 'd']
複数個複数行

このパターンは迷路の問題やアスキーアート的な問題の時に使う

# 標準入力例
4 5
s####
....#
#####
#...g
n, m = map(int, input().split())
g = [[v for v in input()] for _ in range(n)]
# g
# [['s', '#', '#', '#', '#'],
# ['.', '.', '.', '.', '#'],
# ['#', '#', '#', '#', '#'],
# ['#', '.', '.', '.', 'g']]

出力

基本

最終的な答えをansとか適当な変数にいれて

print(ans)

時にYes No -1とか文字列を出力することもある

print('No')
print(-1)
リストの結果を1行に半角スペース開けて出力
# ans = [1, 2, 3, 4, 5]
# 1 2 3 4 5と出力しなくてはいけない
# いろんなやり方があるが
print(*ans)
print(*ans, sep=' ')
print(' '.join(map(str, ans)))
リストの結果を1行にスペースなく出力
# ans = [1, 2, 3, 4, 5]
# 12345と出力しなくてはいけない
# いろんなやり方があるが
print(*ans, sep='')
print(''.join(map(str, ans)))
改行して出力
# ans = [1, 2, 3, 4, 5]
# 以下のように出力しなくてはいけない
1
2
3
4
5

print(*ans, sep='\n')

おわりに

  • 基本的に素直に標準入力から受け取る方法をまとめた。
  • 出力は、基本print()だがリストの結果をいい感じ返す時は工夫する必要があるのでまとめた。
  • 少し変則的なパターンの入力についてはまた別にまとめる

参考

Pythonで競技プログラミング(AtCoder)を始めよう - Qiita

Python3で競技プログラミングする時に知っておきたいtips(入力編) - Qiita

プログラミング(競プロ)に便利な Python3 用法集 ~入力編~ - やるだけPython競プロ日誌