LoginSignup
27
33

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-08-20

本記事は拙著『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

27
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
33