LoginSignup
268
288

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

Last updated at Posted at 2019-05-17

はじめに

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

言語

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

Python (CPython 3.11.4)

コーディングスタイル

解いたコードは pycodestyle の下記バージョンでコーディングスタイルを確認しました。

pycodestyle 2.11.1

コードリポジトリ

解いたコードは下記のリポジトリで公開しています。

第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)]
count = 0
for a in range(A+1):
    for b in range(B+1):
        for c in range(C+1):
            if 500*a+100*b+50*c == X:
                count += 1
print(count)

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

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.

参考

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

268
288
4

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
268
288