AtCoder標準入力(Python)

# 初めに

AtCoderを始めようと思ったので勉強ついでに備忘録を残しておく。処女作。

# 使用する関数やらの説明

## input()関数

`input()`関数を用いると次のように文字列を入力できるようになる。
![スクリーンショット 2025-03-06 211408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029192/5dae0e45-3e42-416e-8728-262309f35bf9.png)
入力した文字列が`input()`関数の戻り値になる
また、関数の引数に文字列を指定すると、入力エリアの前にその文章が表示される。
(画像で言うと、「好きな文字を入力」)
この文章を「プロンプト」と言う。必要なければ書かなくてOK(競プロではいらない)。

`input()`関数の戻り値は「str型」なので注意。


## split()

`文字列.split("区切り文字")`で文字列を区切り文字で区切ったリストが戻り値として得られる。
`,`で区切りたい場合は以下のようにする。

```python
#入力
s = "apple,banana,cheese"

#出力
s.split(",")
#['apple', 'banana', 'cheese']
```

`split()`関数の引数を指定しない時は，スペース，改行，タブが区切り文字になる。

```python
#入力
s = "apple banana cheese"

#出力
s.split()
#['apple', 'banana', 'cheese']
```

## リスト内包表記
繰り返し処理や条件分岐の結果をリストにしたい時、リスト内包表記を用いることでコードを1行でまとめることができる。また，処理も速くなる。

`[処理 for 変数名 in イテラブル]`の形で，繰り返し処理(for文)の結果をリストにできる。

```python
#内包表記を使わずに
double1 = []
for x in range(5):
    double1.append(x*2)

#出力
print(double1)
#[0, 2, 4, 6, 8]

#内包表記を使って
double2 = [i*2 for i in range(5)]

#出力
print(double2)
#[0, 2, 4, 6, 8]
```
以下はこの記事の標準入力では扱わないが記しておく。

さらに条件分岐を使うときは`if 条件式`を末尾に加える。
`[処理 for 変数名 in イテラブル if 条件式]`

```python
#内包表記を使わずに
odds1 = []
for i in range(10):
    if i % 2 == 1:
        odds1.append(i)

#出力
print(odds1)
#[1, 3, 5, 7, 9]

#内包表記を使って
odds2 = [i for i in range(6) if i % 2 == 1]

#出力
print(odds2)
#[1, 3, 5, 7, 9]
```
さらにelse文を使うときは次のように書く。`if 条件式`の位置が処理の後ろになっているので注意。
`[処理(True) if 条件式 else 処理(False) for 変数名 in イテラブル ]`

```python

#内包表記を使わずに
odd10_1 = []
for i in range(10):
    if i % 2 == 1:
        odd10_1.append(i*10)
    else:
        odd10_1.append(i)

#出力
print(odd10_1)
#[0, 10, 2, 30, 4, 50, 6, 70, 8, 90]

#内包表記を使って
odds10_2 = [i*10 if i % 2 == 1 else i for i in range(10)]

#出力
print(odds10_2)
#[0, 10, 2, 30, 4, 50, 6, 70, 8, 90]
```

## map()関数
`map(関数,イテラブル)`でイテラブルの要素にそれぞれ関数を適用したイテレータを返す。
リストで返ってくるわけではないので注意。

```python
#入力
s = list(map(abs, [3,-8,1,0,7,-5]))
#出力
print(s)
#[3, 8, 1, 0, 7, 5]
```

# 標準入力(本題)
## 1行1列データ
**入力**
> N


```python
#str型(文字列)
s = input()
#int型(整数)
s = int(input())
#float型(小数)
s = float(input())
```

## 1行N列データ
**入力**
>A B C

```python
#文字列を１つづつ受け取り
A, B, C = input().split()
#文字列をlist型で受け取り
s = input().split()
#整数を１つづ受け取り
A, B, C = map(int, input().split())
#整数をlist型で受け取り
s = list(map(int, input().split()))
```

## N行1列データ

**入力**
>N
x<sub>1</sub>
x<sub>2</sub>
・
・
・
x<sub>N</sub>

`input()`は標準入力を1行づつ読み取るのに対して、`sys.stdin`は一括で読み取る。
```python
N = int(input()))
x = [int(input()) for _ in range(N)]

#行数(N)が不明の時
import sys
x = []
for i in sys.stdin:
    x.append(int(i))
```
## 2行N列データ

入力
>N
x<sub>1</sub> x<sub>2</sub> ・・・ x<sub>N</sub>
y<sub>1</sub> y<sub>2</sub> ・・・ y<sub>N</sub>

```python
N = int(input())
x = list(map(int,input().split()))
y = list(map(int,input().split()))
```
## 2行N列データ
入力
>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>

```python
# x,yをそれぞれリスト化(zip(*xy)はxyの転置行列)
N = int(input())
xy = [map(int, input().split()) for _ in range(N)]
x, y = [list(i) for i in zip(*xy)]

# x[i] = xy[0][i], y[i]=xy[1][i]としてリスト化
N = int(input())
xy = [list(map(int, input().split())) for _ in range(N)]

#xがint，yがstrの時
N = int(input())
xy = []
for i in range(N):
    a, b = input().split()
    xy.append(int(a),b)
```
必要に応じて追加します。

# 参考にしたサイト
・[競プロ等におけるpython3の標準入力](https://qiita.com/zenrshon/items/c4f3849552348b3dbe67)
・[初心者向けAtcoder標準入力セット(Python)](https://qiita.com/jamjamjam/items/e066b8c7bc85487c0785)
・[【Python 入門】リスト内包表記について解説！](https://www.kikagaku.co.jp/kikagaku-blog/python_list_comprehensions/)
・[【Python入門】split関数で文字列の分割の仕方](https://qiita.com/Morio/items/38701038ad098dd5dc3d)