Edited at

AtCoder に登録したら解くべき精選過去問 10 問をPython3で解いてみた

More than 1 year has passed since last update.


はじめに

どーも、最近競プロをはじめた新人です。

@drkenさんの記事AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~に取り上げられている問題10問をPython3で解いてみました.AtCoderの入門として、非常に素晴らしい記事なので、興味のある方はぜひチェックしてください.

問題の詳細と一般的な解法は元の記事を参照してください.


第1問 ABC 086 A - Product

a, b = map(int, input().split())

if a*b % 2 == 0:
print("Even")
else:
print("Odd")

簡単なif-elseで解きました.


第2問 ABC 081 A - Placing Marbles

print(input().count("1"))

stringのcountを使えば楽.


第3問 ABC 081 B - Shift Only

N = input()

A = list(map(int, input().split()))
cnt = 0
while all(a%2==0 for a in A):
A = [a/2 for a in A]
cnt += 1
print(cnt)

内包表記を使いました.


第4問 ABC 087 B - Coins

A = int(input())

B = int(input())
C = int(input())
X = int(input())
res=0
for i in range(A + 1):
for j in range(B + 1):
for k in range(C + 1):
if 500*i + 100*j + 50*k == X:
res += 1
print(res)

三重ループなので内包表記より全探索を使いました.


第5問 ABC 083 B - Some Sums

N, A, B = map(int, input().split())

res = 0
for i in range(N+1):
if A <= sum([int(s) for s in str(i)]) <= B:
res += i
print(res)

intとstringの相互変換を活用しました.


第6問 ABC 088 B - Card Game for Two

N = int(input())

l = list(map(int, input().split()))
l.sort(reverse=True)
print(sum(l[0::2]) - sum(l[1::2]))

sort来ましたね.


第7問 ABC 085 B - Kagami Mochi

N = int(input())

l = sorted([input() for _ in range(N)])
print(len(set(l)))

sortとsetの連携です.


第8問 ABC 085 C - Otoshidama

N, Y = map(int, input().split())

res = (-1, -1, -1)
for x in range(N + 1):
for y in range(N + 1 - x):
if N - x - y >= 0 and 10000*x + 5000*y + 1000*(N - x - y) == Y:
res = (x, y, N - x - y)
print(res[0], res[1], res[2])

二重ループの例ですが、この解答はあまり好きではありません.


第9問 ABC 049 C - Daydream

given = ["dreamer", "dream", "eraser", "erase"]

S = input()
while len(S) > 0:
judge = [S.endswith(i) for i in given]
if any(judge):
target = given[judge.index(True)]
S = S[:-len(target)]
if len(S) == 0:
print("YES")
break
else:
print("NO")
break

ちょっと難しいですね、DPを使ったら楽かもしれません.


第10問 ABC 086 C -Traveling

N = int(input())

for _ in range(N):
t, x, y = map(int, input().split())
if x + y > t or (t + x + y)%2 != 0:
print("No")
quit()
print("Yes")

元記事の解説を参照しました.主に偶数と奇数の性質を使いました.


終わりに

入門なので、それほど複雑なコードではありません.他の言語と比べて,Pythonが遅いと言われますが、それほど大した問題ではないと思います.速度の方で気になる方もご心配なくPythonを使っていただければ大丈夫だと思います.