Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

はじめに

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

言語

解いたコードは AtCoder の下記言語で AC になることを確認しました。

Python 3.8.2

第1問 ABC086A - Product

a, b = map(int, input().split())
print("Even" if a*b % 2 == 0 else "Odd")

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

第2問 ABC081A - Placing Marbles

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

【解説】入力された文字列sの中にある文字1の数を出力します。

第3問 ABC081B - Shift only

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

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

第4問 ABC087B - Coins

A, B, C, X = [int(input()) for i in range(4)]
print(sum(500*a+100*b+50*c == X for a in range(A+1) for b in range(B+1) for c in range(C+1)))

【解説】下記の方程式を満たす数を出力します。

500a+100b+50c=X (0≦a≦A, 0≦b≦B, 0≦c≦C)

第5問 ABC083B - Some Sums

N, A, B = map(int, input().split())
print(sum(i for i in range(1, N+1) if A <= sum(map(int, str(i))) <= B))

【解説】1以上N以下の整数iの各桁の和がA以上B以下を満たすiの総和を出力します。

第6問 ABC088B - Card Game for Two

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

【解説】入力されたデータを降順でソートし、リストaに格納します。「リストaの偶数番目の和」と「リストaの奇数番目の和」の差を出力します。

第7問 ABC085B - Kagami Mochi

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

【解説】入力されたリストdの要素の重複をなくして、要素の数を出力します。

第8問 ABC085C - 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)

【解説】下記の連立方程式を満たす x, y, z がある場合はx y zの値を出力し、満たす x, y, z がない場合は-1 -1 -1を出力します。

\left\{
\begin{array}{ll}
z=N-x-y & (0≦z≦2000) \\
10000x+5000y+1000z=Y  & (0≦x≦N, 0≦y≦N-x)
\end{array}
\right.

第9問 ABC049C - 白昼夢

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

【解説】入力された文字列Sが「dream」「dreamer」「erase」「eraser」のいずれかを1回以上繰り返されている場合はYES、繰り返されていない場合はNOを出力します。

第10問 ABC086C - Traveling

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

【解説】下記の条件を満たす場合の数がNと同じ場合はYesNと異なる場合はNoを出力します。

\left\{
\begin{array}{ll}
|x-px|+|y-py|≦t-pt \\
t\%2=(x+y)\%2
\end{array}
\right.

参考

本記事は下記を参考にしました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away