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

# はじめに

<B>Python</B> で「[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)」を解きました。

# 言語

解いたコードは AtCoder の下記言語で <font color="#449d44"><B>AC</B></font> になることを確認しました。

```text
Python (CPython 3.11.4)
```

# コーディングスタイル

解いたコードは [pycodestyle](https://pypi.org/project/pycodestyle/) の下記バージョンでコーディングスタイルを確認しました。

```text
pycodestyle 2.14.0
```

# コードリポジトリ

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

* [GitHub - KoyanagiHitoshi/AtCoder-Beginners-Selection](https://github.com/KoyanagiHitoshi/AtCoder-Beginners-Selection)

# 第1問 [ABC086A - Product](https://atcoder.jp/contests/abs/tasks/abc086_a)

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

【解説】`a*b`を`2`で割った余りが`0`となる場合は`Even`、`0`とならない場合は`Odd`を出力します。[［提出結果］](https://atcoder.jp/contests/abs/submissions/45248764)

# 第2問 [ABC081A - Placing Marbles](https://atcoder.jp/contests/abs/tasks/abc081_a)

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

【解説】入力された文字列`s`の中にある文字`1`の数を出力します。[［提出結果］](https://atcoder.jp/contests/abs/submissions/45248785)

# 第3問 [ABC081B - Shift only](https://atcoder.jp/contests/abs/tasks/abc081_b)

```python
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`で割り切れなくなるまでの数を出力します。[［提出結果］](https://atcoder.jp/contests/abs/submissions/45248794)

# 第4問 [ABC087B - Coins](https://atcoder.jp/contests/abs/tasks/abc087_b)

```python
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)
```

【解説】下記の方程式を満たす数を出力します。[［提出結果］](https://atcoder.jp/contests/abs/submissions/45248805)

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

# 第5問 [ABC083B - Some Sums](https://atcoder.jp/contests/abs/tasks/abc083_b)

```python
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`の総和を出力します。[［提出結果］](https://atcoder.jp/contests/abs/submissions/45248819)

# 第6問 [ABC088B - Card Game for Two](https://atcoder.jp/contests/abs/tasks/abc088_b)

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

【解説】入力されたデータを降順でソートし、リスト`a`に格納します。「リスト`a`の偶数番目の和」と「リスト`a`の奇数番目の和」の差を出力します。[［提出結果］](https://atcoder.jp/contests/abs/submissions/45248828)

# 第7問 [ABC085B - Kagami Mochi](https://atcoder.jp/contests/abs/tasks/abc085_b)

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

【解説】入力されたリスト`d`の要素の重複をなくして、要素の数を出力します。[［提出結果］](https://atcoder.jp/contests/abs/submissions/45248838)

# 第8問 [ABC085C - Otoshidama](https://atcoder.jp/contests/abs/tasks/abc085_c)

```python
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`を出力します。[［提出結果］](https://atcoder.jp/contests/abs/submissions/45248851)

```math
\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 - 白昼夢](https://atcoder.jp/contests/abs/tasks/arc065_a)

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

【解説】入力された文字列`S`が「dream」「dreamer」「erase」「eraser」のいずれかを1回以上繰り返されている場合は`YES`、繰り返されていない場合は`NO`を出力します。[［提出結果］](https://atcoder.jp/contests/abs/submissions/45248855)

# 第10問 [ABC086C - Traveling](https://atcoder.jp/contests/abs/tasks/arc089_a)

```python
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`と同じ場合は`Yes`、`N`と異なる場合は`No`を出力します。[［提出結果］](https://atcoder.jp/contests/abs/submissions/45248863)

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

# 参考

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

* [AtCoderで始めるPython入門](https://qiita.com/KoyanagiHitoshi/items/3286fbc65d56dd67737c)
* [AtCoderの問題を分類しました](https://zenn.dev/koyanagihitoshi?tab=books)