AtCoder 最速で緑になる 基礎・典型50問詳細解説 サンプル

本記事は拙著『AtCoder 最速で緑になる 基礎・典型50問詳細解説』のサンプルです。
値段：**100円**(Kindle Unlimited対象)
**【kindle】**
https://www.amazon.co.jp/dp/B0BBB7RKTP

**【booth(pdf)】**
https://booth.pm/ja/items/4102300


# 1 入力と出力 ABC205 A Dif:6

https://atcoder.jp/contests/abc205/tasks/abc205_a

**【概要】**
まずは基本の入力と出力から。
入力の受け取り方は5パターン。<実装のコツ>に記載のものをコピペできるようにどこかへ保存しておこう。出力はどんな問題もprintでOK。
「AtCoder 入力の受け取り」等で検索するとどの受け取り方が速い、遅いという情報も出てくるが入力の受け取りでTLE(実行制限時間超過)することはないので気にしなくていい。とにかく5パターンを使えるようになろう。

**【解説】**
1mLあたりのカロリーはA*(1/100)となるので、BmlあたりのカロリーはA*(1/100)*Bとなる。これを出力すればOK。

**【実装のコツ】**
**<入力の受け取り>**
入力の受け取りは以下の5つを覚えておけばよい。

(1)数字が1つ
入力：N

```python:
N=int(input())
```

(2)数字が2つ以上で別々に受け取り
入力：A B

```python:
A,B=map(int, input().split())
```

(3)文字列が1つ
入力：S

```python:
S=input()
```

(4)文字列が2つ以上で別々に受け取り
入力：S T

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

(5)リストで受け取り
入力：A1 A2 … An

```python:
A=list(map(int, input().split()))
```

本問の場合は「A B」だから
(2)数字が2つ以上で別々に受け取り
のパターン。

**<出力>**
答えの出力は
print(出力したいもの)
と書く。

**<90と90.0>**
入力例1の入力をコピペして実行すると、出力例1の「90」ではなく、「90.0」が出力されて不安になったという人がいるかもしれないが、「90」と「90.0」は同じものとみなされるので大丈夫。

**【提出】**

```python:
# 入力の受け取り
A,B=map(int, input().split())

# A×(1/100)×Bを出力
print(A*(1/100)*B)
```

# 2 条件分岐1 ABC219 A Dif:6

https://atcoder.jp/contests/abc219/tasks/abc219_a

**【概要】**
条件によって処理を分岐する「if」を使えるようになろう。たいていのA問題はifが使えれば解ける。

**【解説】**
以下のように点数の値で条件分岐し、答えを出力する。
初級(0点以上40点未満)→40-X
中級(40点以上70点未満)→70-X
上級(70点以上90点未満)→90-X
エキスパート(90点以上)→"expert"

これらの条件をifで分岐して処理する。
書き方は【実装のコツ】を参照。

**【実装のコツ】**
**\<ifの書き方>**
if 条件:
	処理内容
elif 条件:
	処理内容
else:
	処理内容

if,elifは「条件を満たせば」→「処理内容を行う」という意味。コードの上から順に処理を行っていく。
elseは「そうでなければ」すなわち「if,elifの条件が満たされなければ」→「処理内容を行う」という意味。

**<文字列の出力>**
文字を出力する際は
print(”文字”)
というようにダブルクオーテーションをつける。
pythonにこれは変数ではなく、文字であると伝えるため。
・正print(“expert”)
・誤print(expert)

**【提出】**

```python:
# 入力の受け取り
X=int(input())

# 初級の場合
if 0<=X<40:
    # 40-Xを出力
    print(40-X)
# 中級の場合
elif 40<=X<70:
    # 70-Xを出力
    print(70-X)
# 上級の場合
elif 70<=X<90:
    # 90-Xを出力
    print(90-X)
# エキスパートの場合
else:
    # "expert"を出力
    print("expert")
```

# 3 関数 ABC234 A Dif:7

https://atcoder.jp/contests/abc234/tasks/abc234_a

**【概要】**
関数は競技プログラミングのみならず、プログラミングの基本要素の一つ。うまく使えればコード量を減らしたりすっきり見やすくしたりすることができる。まずはこの問題で書き方を覚えよう。

**【解説】**
f(x)=x^2+2x+3と定義してしまい、f(f(f(t)+t)+f(f(t)))を計算する。

関数の作り方、使い方がわからない人は【実装のコツ】を参照のこと。

**【実装のコツ】**
<関数>
関数は
入力→(処理)→値を返す
というような一連の処理を指す。処理内容は自分でプログラムできる。
書き方は以下。

def 関数名(引数)
(処理)
retum 返り値

例えば以下は「x」を入力すると「3x」を返す関数。

```python:
def time_3(x):
    return 3*x
```

同じようにしてf(x)を定義する。すなわち以下のようになる。

```python:
# 関数の定義
# 引数；x 返り値：t^2+2t+3
def f(x):
    return x**2+2*x+3
```

**【提出】**

```python:
# 入力の受け取り
t=int(input())

# 関数の定義
# 引数；x返り値：x^2+2x+3
def f(x):
    return x**2+2*x+3

# 答えの計算
ans=f(f(f(t)+t)+f(f(t)))

# 答えの出力
print(ans)
```

# 4 for文 ABC204 B Dif:9

https://atcoder.jp/contests/abc204/tasks/abc204_b

**【概要】**
「for」は「if」と同じくプログラミングの基礎の基礎。for文がしっかり理解できればだいたいのB問題は解くことができる。この問題で書き方を覚えよう。

**【解説】**
A[i]を順番に確認していく。
・A[i]が10より大きければ→(A[i]-10)個の木の実を収穫する。

**【実装のコツ】**
**<0インデックスでの受け取り>**
問題文はA1,A2,...,ANとなっているが、pythonではリストの添字が0から始まる。すなわち
A1=A[0]
A2=A[1]
…
AN=A[N-1]
と一つずつずれていくことに注意しよう。

**<for文の使い方>**
i=0~(N-1)まで順に処理したいという場合は以下のように書く。
for i in range(N):
range(数字)の数字は(最後の値+1)となる。
(N-1)までの場合は+1した値、すなわちNとなることに注意。

**【提出】**

```python:
# 入力の受け取り
N=int(input())
A=list(map(int, input().split()))

# 答え
ans=0

# i=0~N-1まで
for i in range(N):
    # A[i]が10より大きければ
    if 10<A[i]:
        # A[i]-10をansにプラスする
        ans+=A[i]-10

# 答えの出力
print(ans)
```

**【別解】**
「A[i]が10より大きければ」
の部分を
「0か(A[i]-10)の大きい方」
と考えれば、ifを使わずにmaxで解くこともできる。

for x in A:
と書くことでxにAの値を順に入れて処理できる。

```python:
# 入力の受け取り
N=int(input())
A=list(map(int, input().split()))
 
# 答えの格納用変数
ans=0

# xへAの値を順に入れる
for x in A:
    # 0と(x-10)の大きい方を足す
    ans+=max(0,x-10)
 
# 答えの出力
print(ans)
```

# 5 文字列操作 ABC232 A Dif:9

https://atcoder.jp/contests/abc232/tasks/abc232_a

**【概要】**
文字列の扱い方を覚えよう。pythonでは0インデックスになるので先頭が0文字目となることに注意。

**【解説】**
Sの0文字目(左端)、2文字目を取り出し、整数に変換して掛け算すればOK。
○文字目の確認方法、整数への変換方法は【実装のコツ】を参照。

**【実装のコツ】**
<文字の数え方>
pythonではSのx文字目をS[x]と書く。
注意が必要なのは先頭の文字は0文字目、すなわちS[0]であること。問題文で言う1文字目はプログラムではS[0]となる。

<文字列→整数へ変換>
S[0]、S[2]はそのままでは文字列なので掛け算ができない。そこで整数への変換が必要。
int(文字列)
と書くことで文字列→整数へ変換が可能。

**【提出】**

```python:

# 入力の受け取り
S=input()

# Sの0文字目と2文字目を整数へ変換
S0=int(S[0])
S2=int(S[2])

# 掛け算して出力
print(S0*S2)
```

# 収録問題一覧
1 入力と出力 ABC205 A Dif:6
2 条件分岐1 ABC219 A Dif:6
3 関数 ABC234 A Dif:7
4 for文 ABC204 B Dif:9
5 文字列操作 ABC232 A Dif:9
6 文字コード変換 ABC218 B Dif:14
7 リスト操作 ABC241 A Dif:15
8 set ABC240 B Dif:19
9 図形 ABC246 A Dif:28
10 二次元配列、ソート1 ABC201 B Dif:32
11 二重ループ ABC234 B Dif:46
12 条件分岐2 ABC205 C Dif:63
13 周期性 ABC220 C Dif:119
14 逆順操作 ABC216 C Dif:145
15 貪欲法 ABC229 C Dif:165
16 インタラクティブ ABC244 C Dif:165
17 連想配列1 ABC206 C Dif:171
18 itertools ABC215 C Dif:178
19 二分探索1 ABC231 C Dif:194
20 ソート2 ABC209 C Dif:285
21 シミュレーション1 ABC214 C Dif:319
22 bit全探索 ABC221 C Dif:379
23 区間の処理 ABC207 C Dif:397
24 座標圧縮 ABC213 C Dif:481
25 heap ABC234 D Dif:503
26 deque ABC237 D Dif:544
27 DP1 ABC211 C Dif:559
28 全探索2 ABC233 C Dif:604
29 BFS1 ABC204 C Dif:629
30 規則性利用 ABC238 C Dif:637
31 全探索3 ABC227 C Dif:692
32 DFS1 ABC213 D Dif:710
33 連想配列2 ABC218 D Dif:715
34 UnionFind1 ATC B
35 UnionFind2 ABC231 D Dif:726
36 尺取法1、区間和 ABC229 D Dif:745
37 BFS2 ABC211 D Dif:755
38 シミュレーション2 ABC243 D Dif:758
39 DP2 ABC248 C Dif:787
40 二分探索2 ABC248 D Dif:793
41 尺取法2、エラトステネスの篩 ABC250 D Dif:797
42 FenwickTree ACL B
43 想定解multiset ABC217 D Dif:802
44 DP3 ABC204 D Dif:832
45 区間スケジューリング ABC230 D Dif:963
46 UnionFind3 ABC218 E Dif:1004
47 DFS2 ABC239 E Dif:1084
48 DP4 ABC219 D Dif:1085
49 二分探索3 ABC246 D Dif:1148
50 ワーシャルフロイド法 ABC208 D Dif:1190
クラス解説：UnionFind
クラス解説：FenwickTree