初心者向けAtcoder標準入力セット(Python)

#はじめに
もう何番煎じかわかりませんが、Atcoder用の標準入力セットのまとめです。

Atcoderをだらだらとやっているのですが、精進を全然していないためいつまで経っても標準入力を覚えることが出来ていません。
ということで、いったん標準入力を整理しつつ、より高速な標準入力を体系的にまとめたいと思います。

本記事では基本中の基本となるABC-ABC問題を解くための最低限の標準入力をまとめます。
sysやnumpyを使った標準入力は別の記事で触れます。

指摘いただいた箇所を修正致しました(2020/05/06)。

#1行1列データ
**入力**

>N(文字列または数)

**コード**

```sample.py
#str型で受け取るとき
s = input() 
#int型で受け取るとき
s = int(input()) 
#float型　(小数)で受け取るとき
s = float(input())
```

注意事項として、文字列ではなく数字の場合でも、input()では全てstr型になることに注意。

#(1,N)行列データ

**入力**

>A B

###入力が文字列の場合
**入力例**
>Alice Bob Charlie

**コード例1**

```sample.py
#list型で受け取るとき
s = input().split()

#出力
>>>print(s)
['Alice', 'Bob', 'Charlie']
>>>print(s[0])
Alice
>>>print(s[0][0])
A
```
**コード例2**

```sample.py
#文字列として受け取るとき
A, B, C = input().split()

#出力
>>>print(A)    
Alice
>>>print(A,B,C)
Alice Bob Charlie
```

###入力変数が整数の場合

**入力例**
>1 3

**コード例1**

```sample.py
A, B = map(int, input().split())

#出力
>>>print(A)
1
>>>print(A,B)
1 3
```
###入力変数の数がN個の場合
**入力**

>A<sub>1</sub> A<sub>2</sub> A<sub>3</sub>...A<sub>N</sub> 

**入力例**
>1 3 4 5 6

**コード例1**

```sample.py
#list型で取得
l = list(map(int, input().split()))

#出力
>>>print(l)
[1, 3, 4, 5, 6]
```

### 文字列と数字の複合

```python
N, S = map(str, input().split())
```

##(N,1)行列データ
**入力**
>N M
>A<sub>1</sub>
>A<sub>2</sub>
>:
>A<sub>N</sub>

**入力例**
>3 4
>2
>3
>3
>1

**コード例1(int型)**
空のリストを生成して上から順にリストへ格納することで、(N,1)行列を(1,N)行列に変換する

```sample.py
N, M = map(int, input().split())
#空のリスト
A = []
#リストAにappend()を使って格納していく
for _ in range(M):
    A.append(int(input()))

#出力
>>>print(A)
[2, 3, 3, 1]
```
**コード例2(リスト内包表記)**

```sample.py
N, M = map(int, input().split())
#リスト内包表記
A = [int(input()) for _ in range(M)]

#出力
>>>print(A)
[2, 3, 3, 1]
```


#(N,M)行列データ

##2変数データ
###行に変数が並ぶとき
**入力**
>N
>x<sub>1</sub> x<sub>2</sub> x<sub>3</sub> .. x<sub>N</sub>
>y<sub>1</sub> y<sub>2</sub> y<sub>3</sub> .. y<sub>N</sub>

**入力例**
>3
>1 2 3
>4 5 6

**コード例**

```sample.py
N = int(input())
x = list(map(int, input().split()))
y = list(map(int, input().split()))

#出力
>>>print(x)
[1, 2, 3]
```

###列に変数が並ぶとき
**入力**
>N 
>x<sub>1</sub> y<sub>1</sub>
>x<sub>2</sub> y<sub>2</sub>
>:
>x<sub>N</sub> y<sub>N</sub>

**入力例**
>5
>1 2
>3 4
>5 6
>7 8
>9 10

**コード例1(x,yを独立に格納)**

```sample.py
N = int(input())
xy = [map(int, input().split()) for _ in range(N)]
x, y = [list(i) for i in zip(*xy)]

#出力
>>>print(x)
[1, 3, 5, 7, 9]
>>>print(x[1]+y[1])
7
```

**コード例2([x<sub>i</sub>,y<sub>i</sub>]として格納)**

```sample.py
N = int(input())
l = [list(map(int, input().split())) for l in range(N)]

#出力
>>>print(l)
[[1, 2], [3, 4], [5, 6]]
```

####**int型とstr型混合の場合**
**入力例**
>5
>1 a
>3 b
>5 c
>7 d
>9 e

```sample.py
N = int(input())
list = []
for i in range(N):
    a,b=input().split()
    list.append([int(a), b])
    
#出力
>>>print(list)
[[1, 'a'], [3, 'b'], [5, 'c'], [7, 'd'], [9, 'e']]
>>>print(type(list[0][0]))
<class'int'>
>>>print(type(list[0][1]))
<class'str'>
```

>非常に分かりやすかったのでこちらの記事から引用させていただきました
>[競プロ等におけるpython3の標準入力](https://qiita.com/zenrshon/items/c4f3849552348b3dbe67)

##3変数データ

**入力**
>N
>t<sub>1</sub> x<sub>1</sub> y<sub>1</sub>
>t<sub>2</sub> x<sub>2</sub> y<sub>2</sub>
>:
>t<sub>N</sub> x<sub>N</sub> y<sub>N</sub>

**入力例**
>2
>3 1 2
>6 1 1


```sample.py
#先に入力変数分の長さを持つlistを作っておく。※N = 5の場合,t = [0,0,0,0,0]
N = int(input())
t = [0] * N
x = [0] * N
y = [0] * N
for i in range(N):
    #上から順番に代入していく
    t[i], x[i], y[i] = map(int, input().split())

#出力
>>>print(t)
[3, 6]
```

>こちらの記事から引用させていただきました
>[Python3で競技プログラミングする時に知っておきたいtips（入力編）](https://qiita.com/kyuna/items/8ee8916c2f4e36321a1c)

###3変数データ(データの数が変数ごとに異なる場合)
**入力**
>X Y A B C
>P<sub>1</sub> P<sub>2</sub> P<sub>3</sub>...P<sub>A</sub>
>Q<sub>1</sub> Q<sub>2</sub> Q<sub>3</sub>...Q<sub>B</sub>
>R<sub>1</sub> R<sub>2</sub> R<sub>3</sub>...R<sub>C</sub>

問題:[E - Red and Green Apples](https://atcoder.jp/contests/abc160/tasks/abc160_e)

**入力例**

>1 2 2 2 1
>2 4
>5 1
>3

```sample.py
X, Y, A, B, C = map(int, input().split())
P = [int(i) for i in input().split()]
Q = [int(i) for i in input().split()]
R = [int(i) for i in input().split()]

#出力
>>>print(P)
[2, 4]

#この形でも問題ない
P = list(map(int, input().split()))
Q = list(map(int, input().split()))
R = list(map(int, input().split()))
```


##一般行列データ

**入力**
>N M 
>A<sub>1</sub><sub>,1</sub> A<sub>1</sub><sub>,2</sub>...A<sub>1</sub> <sub>,N</sub>
>:
>A<sub>M</sub><sub>,1</sub> A<sub>M</sub><sub>,2</sub>...A<sub>M</sub><sub>,N</sub>

**入力例 (3,3)行列データ　**
>3 3
>2 1 3
>1 3 3
>2 2 1

**コード例1(int型)**

```sample.py
N, M = map(int,input().split()) 
#リスト内包表記
#上から順にlistを読み込んでlistに格納していく。
a = [list(map(int, input().split())) for l in range(M)]

#出力
>>>print(a)
[[2, 1, 3], [1, 3, 3], [2, 2, 1]]

>>>print(a[0])
[2, 1, 3]
>>>print(a[0][0])
2
>>>print(type(a[0][0]))
<class'int'>
```

###補足-numpy-
**numpy**について少しだけ紹介。
**numpy**を使うとリストを**numpy配列ndarray**に変換できます。この変換を行うことで、行列演算を行うだけでなく、実行速度を高速化、コードの簡略化を行うことができます。

```sample.py
import numpy as np
#適当なlist
list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

#ndarrayに変換
list_ndarray = np.array(list)
>>>print(list_ndarray)
[[1 2 3]
 [4 5 6]
 [7 8 9]]

#配列のサイズ(要素数)
>>>print(list_ndarray.size)
9
#配列の形状
>>>print(list_ndarray.shape)
(3, 3)
#型
>>>print(type(list_ndarray))
<class'numpy.ndarray'>

#numpy配列→リスト
list_list = list_ndarray.tolist()
>>>print(list_list)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>>print(type(list_list))
<class'list'>
```

#参考にさせていただいた記事
・[python3での標準入力]
(https://qiita.com/pyu666/items/6b8cfefc1ea994639683)
・[Python3で競技プログラミングする時に知っておきたいtips（入力編）](https://qiita.com/kyuna/items/8ee8916c2f4e36321a1c)
・[競プロ等におけるpython3の標準入力](https://qiita.com/zenrshon/items/c4f3849552348b3dbe67)
・[python de 競技プログラミング](https://qiita.com/hahho/items/dcf482d43bc29ebfb53c)

#標準入力・標準出力について
以下の記事に詳しく載っています。
・[標準入力・標準出力ってなに？]
(https://qiita.com/angel_p_57/items/03582181e9f7a69f8168)


適宜加筆修正を加えます。

別の記事に続きます。