276
Help us understand the problem. What are the problem?

posted at

updated at

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

はじめに

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

言語

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

Python (3.8.2)

コーディングスタイル

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

pycodestyle 2.9.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.

参考

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

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
276
Help us understand the problem. What are the problem?