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


はじめに

@drkenさんの記事「AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~」を Python で解きました。


実行環境

解答例は AtCoder の下記言語でACになることを確認しました。

Python3 (3.4.3)


第1問 ABC 086 A - Product


解答例

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

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

[解説] a*b2で割った余りが0となる場合はEven0とならない場合はOddを出力します。


第2問 ABC 081 A - Placing Marbles


解答例①

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


[解説①] 入力された文字列の中にある1の個数を出力します。


解答例②

print(int(input())%9)


[解説②] 入力された数を9で割った余りを出力します。

[証明] 111 mod 9 = (100 + 10 + 1) mod 9 = (100 mod 9) + (10 mod 9) + (1 mod 9) = 3


第3問 ABC 081 B - Shift only


解答例

input()

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

[解説] リストAのすべての要素が2で割り切れなくまで、リストAのすべての要素を2で割り続けます。リストAのすべての要素が2で割り切れなくなるまでの回数を出力します。


第4問 ABC 087 B - Coins


解答例

a,b,c,X=[int(input()) for i in range(4)]

print([500*x+100*y+50*z for z in range(c+1) for y in range(b+1) for x in range(a+1)].count(X))

[解説] 方程式500x+100y+50z=X (0≦x≦a, 0≦y≦b, 0≦z≦c)を満たす個数を出力します。


第5問 ABC 083 B - Some Sums


解答例

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

print(sum(i for i in range(n+1) if a<=sum(map(int,str(i)))<=b))

[解説] a≦n≦bを満たすnの総和を出力します。


第6問 ABC 088 B - Card Game for Two


解答例

input()

a=sorted(map(int,input().split()))[::-1]
print(sum(a[::2])-sum(a[1::2]))

[解説] 入力されたリストを降順でソートし、「リストaの偶数番目の和」と「リストaの奇数番目の和」の差を出力します。


第7問 ABC 085 B - Kagami Mochi


解答例

N=int(input())

d=[input() for i in range(N)]
print(len(set(d)))

[解説] 入力されたリストの要素をユニークにして(要素の重複をなくして)、要素の数を出力します。


第8問 ABC 085 C - Otoshidama


解答例

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

for x in range(N+1):
for y in range(N-x+1):
z=N-x-y
if 0<=z<=2000 and 10000*x+5000*y+1000*z==Y:
print(x,y,z)
exit()
print(-1,-1,-1)

[解説] 連立方程式z=N-x-y (0≦z≦2000) 10000x+5000y+1000z=Y (0≦x≦N, 0≦y≦N-x)を満たすx,y,zを出力します。


第9問 ABC 049 C - Daydream


解答例

import re

print("YES" if re.match("^(dream|dreamer|erase|eraser)+$",input()) else "NO")

[解説] 「dream」「dreamer」「erase」「eraser」のいずれかを1回以上繰り返しがされている場合はYES、繰り返されていない場合はNOを出力します。


第10問 ABC 086 C - Traveling


解答例

N=int(input())

count=0
for i in range(N):
t,x,y=map(int,input().split())
if x+y<=t and t%2==(x+y)%2:count+=1
print("Yes" if count==N else "No")

[解説] 連立方程式x+y≦t t/2=(x+y)/2を満たす場合の数が、Nと異なる場合はYesNと同じ場合はNoを出力する。


参考サイト