本記事は拙著『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
【概要】
まずは基本の入力と出力から。
入力の受け取り方は5パターン。<実装のコツ>に記載のものをコピペできるようにどこかへ保存しておこう。出力はどんな問題もprintでOK。
「AtCoder 入力の受け取り」等で検索するとどの受け取り方が速い、遅いという情報も出てくるが入力の受け取りでTLE(実行制限時間超過)することはないので気にしなくていい。とにかく5パターンを使えるようになろう。
【解説】
1mLあたりのカロリーはA*(1/100)となるので、BmlあたりのカロリーはA*(1/100)*Bとなる。これを出力すればOK。
【実装のコツ】
<入力の受け取り>
入力の受け取りは以下の5つを覚えておけばよい。
(1)数字が1つ
入力:N
N=int(input())
(2)数字が2つ以上で別々に受け取り
入力:A B
A,B=map(int, input().split())
(3)文字列が1つ
入力:S
S=input()
(4)文字列が2つ以上で別々に受け取り
入力:S T
S,T=map(str, input().split())
(5)リストで受け取り
入力:A1 A2 … An
A=list(map(int, input().split()))
本問の場合は「A B」だから
(2)数字が2つ以上で別々に受け取り
のパターン。
<出力>
答えの出力は
print(出力したいもの)
と書く。
<90と90.0>
入力例1の入力をコピペして実行すると、出力例1の「90」ではなく、「90.0」が出力されて不安になったという人がいるかもしれないが、「90」と「90.0」は同じものとみなされるので大丈夫。
【提出】
# 入力の受け取り
A,B=map(int, input().split())
# A×(1/100)×Bを出力
print(A*(1/100)*B)
2 条件分岐1 ABC219 A Dif:6
【概要】
条件によって処理を分岐する「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)
【提出】
# 入力の受け取り
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
【概要】
関数は競技プログラミングのみならず、プログラミングの基本要素の一つ。うまく使えればコード量を減らしたりすっきり見やすくしたりすることができる。まずはこの問題で書き方を覚えよう。
【解説】
f(x)=x^2+2x+3と定義してしまい、f(f(f(t)+t)+f(f(t)))を計算する。
関数の作り方、使い方がわからない人は【実装のコツ】を参照のこと。
【実装のコツ】
<関数>
関数は
入力→(処理)→値を返す
というような一連の処理を指す。処理内容は自分でプログラムできる。
書き方は以下。
def 関数名(引数)
(処理)
retum 返り値
例えば以下は「x」を入力すると「3x」を返す関数。
def time_3(x):
return 3*x
同じようにしてf(x)を定義する。すなわち以下のようになる。
# 関数の定義
# 引数;x 返り値:t^2+2t+3
def f(x):
return x**2+2*x+3
【提出】
# 入力の受け取り
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
【概要】
「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]
と一つずつずれていくことに注意しよう。
i=0~(N-1)まで順に処理したいという場合は以下のように書く。
for i in range(N):
range(数字)の数字は(最後の値+1)となる。
(N-1)までの場合は+1した値、すなわちNとなることに注意。
【提出】
# 入力の受け取り
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の値を順に入れて処理できる。
# 入力の受け取り
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
【概要】
文字列の扱い方を覚えよう。pythonでは0インデックスになるので先頭が0文字目となることに注意。
【解説】
Sの0文字目(左端)、2文字目を取り出し、整数に変換して掛け算すればOK。
○文字目の確認方法、整数への変換方法は【実装のコツ】を参照。
【実装のコツ】
<文字の数え方>
pythonではSのx文字目をS[x]と書く。
注意が必要なのは先頭の文字は0文字目、すなわちS[0]であること。問題文で言う1文字目はプログラムではS[0]となる。
<文字列→整数へ変換>
S[0]、S[2]はそのままでは文字列なので掛け算ができない。そこで整数への変換が必要。
int(文字列)
と書くことで文字列→整数へ変換が可能。
【提出】
# 入力の受け取り
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