マイナビプログラミングコンテスト2021 A~C問題の解説記事です。
(AtCoder Beginner Contest 201)
灰色~茶色コーダーの方向けに解説しています。
その他のABC解説、動画などは以下です。
株式会社マイナビ様について
株式会社マイナビ様は就職に関するサービスを始め、幅広い領域のサービスを提供している企業です。
深層学習やAI分野に力を入れており、アルゴリズムや数学の知識がある方を積極的に採用しているとのことです。
詳しく知りたい方は採用情報のページをご覧ください。
A - Tiny Arithmetic Sequence
A1,A2,A3の並び順としてありうるのは6通りです。
問題文記載の通り、数列を(小,中,大)として「中」-「小」=「大」-「中」が成り立っているか順に確認します。
あり得る並び順と、その計算は以下のとおりです。
(A1,A2,A3) → A2-A1=A3-A2
(A1,A3,A2) → A3-A1=A2-A1
(A2,A1,A3) → A1-A2=A3-A1
(A2,A3,A1) → A3-A2=A1-A3
(A3,A1,A2) → A1-A3=A2-A1
(A3,A2,A1) → A2-A3=A1-A2
これらをif文で分岐、確認していきます。
一つでも条件を満たせば「Yes」を出力し、途中で終了します。
途中で終了するときはexit()と書きます。
条件を満たすものがなかった場合は「No」を出力します。
「Yes」「No」は文字列なので、出力の際、"Yes","No"とダブルクオーテーションをつけてください。
【別解】
A1,A2,A3を小さい順にソートがすることで条件分岐を少なくすることもできます。
A1,A2,A3をリストとして受け取り、ソートして「中」-「小」=「大」-「中」が成り立っているか確認すればOKです。
実装方法は【提出2】を見てください。
入力の受け取り、出力がわからない方は以下の記事を参考にしてください。
【提出1】
# 入力の受け取り
A1,A2,A3=map(int, input().split())
# (A1,A2,A3) → A2-A1=A3-A2ならば
if A2-A1==A3-A2:
# 「Yes」を出力
print("Yes")
# 終了
exit()
# (A1,A3,A2) → A3-A1=A2-A1ならば
elif A3-A1==A2-A3:
print("Yes")
exit()
# (A2,A1,A3) → A1-A2=A3-A1ならば
elif A1-A2==A3-A1:
print("Yes")
exit()
# (A2,A3,A1) → A3-A2=A1-A3ならば
elif A3-A2==A1-A3:
print("Yes")
exit()
# (A3,A1,A2) → A1-A3=A2-A1ならば
elif A1-A3==A2-A1:
print("Yes")
exit()
# (A3,A2,A1) → A2-A3=A1-A2ならば
elif A2-A3==A1-A2:
print("Yes")
exit()
# 「No」を出力
print("No")
【提出2】
# 入力をリストとして受け取り
A=list(map(int, input().split()))
# 小さい順にソート
A.sort()
# A[1]-A[0]=A[2]-A[1]ならば
if A[1]-A[0]==A[2]-A[1]:
# 「Yes」を出力
print("Yes")
# そうでないなら
else:
# 「Noを出力」
print("No")
B - Do you know the second highest mountain?
この問題は拙著「AtCoder 凡人が『緑』になるための精選50問詳細解説」にて解説しています。
サンプルとして全文無料公開しているので下記の記事を御覧ください。
C - Secret Number
「0000」~「9999」まで、条件を満たしているか一つずつ確認します。
実装は以下のように行います。
(1)for文でx=0~9999を作る
(2)xを文字列へ変換する
(3)4桁に満たないものについて先頭に0埋めを行う。
(文字列).zfill(桁数)とすることで指定した桁数になるよう0埋めができます。
例:x="123"のとき、x.zfill(4)="0123"
(4)Sのi(0~9)文字目について
S[i]=「○」ならば
xがiを含むか確認→含んでいなければ暗証番号ではない
S[i]=「x」ならば
xがiを含むか確認→含んでいれば暗証番号ではない
xがi(文字列)を含むかは以下のように書きます。
if str(i) in x:
含んでいないかはnotをつけます。
if str(i) not in x:
暗証番号かどうかを判定する変数(OK)を作っておくとスムーズに実装ができます。
OK=Trueなら暗証番号として適する
OK=Falseなら暗証番号として適さない
とします。
最初Trueにしておいて、条件を一つでも満たさなければFalseへ変更します。
(5)暗証番号に適するならカウントする
(6)カウントした数を出力する
【提出】
# 入力の受け取り
S=input()
# ありうるものを数える変数
count=0
# x=0~9999まで
for x in range(10000):
# 暗証番号として適するならTrue,適さないならFalse
OK=True
# xを文字列へ
x=str(x)
# 4桁になるよう0埋め
x=x.zfill(4)
# i=0~9まで
for i in range(10):
# S[i]が「○」なら
if S[i]=="o":
# iがxに含まれていなければ
if str(i) not in x:
# 暗証番号に適さない
OK=False
# S[i]が「x」なら
if S[i]=="x":
# iがxに含まれるなら
if str(i) in x:
# 暗証番号に適さない
OK=False
# 暗証番号に適していれば
if OK==True:
# カウントする
count+=1
# 答えの出力
print(count)
【広告】
『AtCoder 凡人が『緑』になるための精選50問詳細解説』
AtCoderで緑になるための典型50問をひくほど丁寧に解説した本(kindle)、pdf(booth)を販売しています。
値段:100円(Kindle Unlimited対象)
【kindle】
【booth(pdf)】
1~24問目まではサンプルとして無料公開しています
『AtCoder ABC201~225 ARC119~128 灰・茶・緑問題 超詳細解説』
ABC201~225、ARC119~128 の 灰・茶・緑DIfficulty問題(Dif:0~1199) を解説しています。
とにかく 細かく、丁寧に、具体例を豊富に、実装をわかりやすく、コードにコメントをたくさん入れて 解説しています。
サンプルを5問分公開しています
Qiitaにて無料公開している『ものすごく丁寧でわかりやすい解説』シリーズをベースにしていますが、 【キーワード】【どう考える?】【別解】を追加 し、 【解説】と【実装のコツ】を分ける ことでよりわかりやすく、 具体例や図もより豊富に 書き直しました。
Qiitaには公開していない ARC119~128の灰・茶・緑DIfficulty問題も書き下ろし ています。
値段:300円(Kindle Unlimited対象)
【kindle】
【booth(pdf)】
ARC119~128の部分のみ抜粋した廉価版 もあります。
値段:200円(Kindle Unlimited対象)
【kindle】
【booth(pdf)】
『Excelでリバーシを作ろう!! マクロ、VBAを1から学ぶ』
Excelのマクロ(VBA)で「三目並べ」「マインスイーパー」「リバーシ」を作る解説本です!
マクロ、VBAが全くわからない人でも大丈夫! 丁寧な解説と図でしっかり理解しながら楽しくプログラミングを学ぶ事ができます!
値段:300円(Kindle Unlimited対象)
サンプルとして「準備」~「三目並べ」を無料公開しています。
【kindle】
【booth(pdf】