【Python】Atcoderの過去精鋭問題10問を解く

# 背景
入社試験のプログラミングテスト対策のために、勉強しようと思った。そこで、日本語で多くの解説が載っているサイトとして、AtCoderがあったため勉強する。

# 目的
プログラミングテストの対策のために勉強する

# はじめに
プログラミングテストを受ける上で、多くの解説があるサイトが、自分の勉強につながると思った。
そのため、日本語のコミュニティで、プログラミングテストを多く実施している所を探していたところ、AtCoderがあったため、勉強している。

## 要件定義
1. AtCoder Beginners Selectionをとく
1. 関連問題をとく
1. LeetCode60問をとく

# 環境
- Windows10Pro
- Python3.7
- Anaconda


# やった結果
## 第1問: [ABC 086 A - Product](https://atcoder.jp/contests/abc086/tasks/abc086_a)
```Python
a,b=map(int,input().split())
if a*b%2==0:
   print('Even')
else :
    print('Odd')
```
## 第2問: [ABC 081 A - Placing Marbles](https://atcoder.jp/contests/abc081/tasks/abc081_a)
```Python
s=input()
count=0
for i in s:
    # print(i)
    if int(i)==1:
        count+=1
    # print(count)

print(count)
```
### 別解1
シンプルだし、こっちの方が好きです。
04/19の時にcountを使ったら、RunTimeErrorで失敗したので、最初の回答を使うのがおすすめです。

``` ```Python
print(input().count('1'))
```
### 別解2
数学力が試される導き方
あんまりおすすめじゃないです。
数学が得意な人は、好きな書き方かも。

```

print(int(input())%9)
```


## 第3問: [ABC 081 B - Shift Only](https://atcoder.jp/contests/abc081/tasks/abc081_b)
```Python
N = int(input())
A = 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)
```
## 第4問: [ABC 087 B - Coins](https://atcoder.jp/contests/abc087/tasks/abc087_b)
```Python
A=int(input())
B=int(input())
C=int(input())
X=int(input())

count=0

for a in range(A+1):
    for b in range(B+1):
        for c in range(C+1):
            if X==500*a+100*b+50*c:
                    count+=1

print(count)
```

## 第5問: [ABC 083 B - Some Sums](https://atcoder.jp/contests/abc083/tasks/abc083_b)
mapを使うと便利に仕分けをすることが出来るということを知った。
初めて使った。




```Python
N = int(input())
A = int(input())
B = int(input())
N,A,B=map(int,input().split())

def FindSumOfDigits(num):
    count = 0
    while num > 0:
        count += num % 10
        # ここが違う一つ/が足りない
        num=num // 10

    return count

for n in range(1, N+1):
    count = FindSumOfDigits(n)
    if A<= count <=B:
        ans += n
print(ans)
```


## 第6問: [ABC 088 B - Card Game for Two](https://atcoder.jp/contests/abc088/tasks/abc088_b)
```Python
N=int(input())
A=list(map(int,input().split()))
A.sort(reverse=True)

Alice=Bob=0

for i in range(N):
    if i%2==0:
        Alice+=A[i]
    else:
        Bob+=A[i]

print(Alice-Bob)
```
## 第7問: [ABC 085 B - Kagami Mochi](https://atcoder.jp/contests/abc085/tasks/abc085_b)

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

## 第8問: [ABC 085 C - Otoshidama](https://atcoder.jp/contests/abc085/tasks/abc085_c)
連立方程式などを解くという数学的な技能を使う問題だった。

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

res10000 = res5000 = res1000 = -1

for a in range(N + 1):
    for b in range(N + 1 - a):
        c = N - a - b
        if Y == 10000 * a + 5000 * b + 1000 * c:
            res10000 = a
            res5000 = b
            res1000 = c

print(a, b, c)
```
## 第9問: [ABC 049 C - Daydream](https://atcoder.jp/contests/abc049/tasks/arc065_a)
```Python
s = input().replace("eraser","").replace("erase","").replace("dreamer","").replace("dream","")

# if文の書き換え
# print('NO' if s else 'YES')

if s:
  print("NO")
else:
  print("YES")
```

後ろから、検索していって、消していくという考え方

```Python
def main():
    S = input()

    while len(S) >= 5:
        if len(S) >= 7 and S[-7:] == "dreamer":
            S = S[:-7]
            continue

        if len(S) >= 6 and S[-6:] == "eraser":
            S = S[:-6]
            continue

        elif S[-5:] == "dream" or S[-5:] == "erase":
            S = S[:-5]
            continue

        else:
            break

    if len(S) == 0:
        print("YES")
    else:
        print("NO")
main()
```


## 第10問: [ABC 086 C - Traveling](https://atcoder.jp/contests/abc086/tasks/arc089_a)
数学的な解き方

```Python
n=int(input())
for i in range(n):
    t,x,y=map(int,input().split())
    if (x+y) > t or (x+y+t)%2:
        print('No')
        exit()

print('Yes')
```
### 別解1 王道な解き方
```Python

N = int(input())
t = [0] * (N+1)
x = [0] * (N+1)
y = [0] * (N+1)
for i in range(N):
    t[i+1], x[i+1], y[i+1] = map(int, input().split())

f = True
for i in range(N):
    dt = t[i+1] - t[i]
    dist = abs(x[i+1]-x[i]) + abs(y[i+1]-y[i])
    if dt < dist:
        f = False
    if dist%2 != dt%2:
        f = False

print('Yes' if f else 'No')
```
### 別海2
```Python
import sys

def main():
    N = int(input())
    t, x, y = 0, 0, 0

    for _ in range(N):
        next_t, next_x, next_y = [int(__) for __ in input().split()]

        delta_t = next_t - t
        distance = abs(next_x - x) + abs(next_y - y)

        if distance > delta_t:
            print("No")
            sys.exit()

        if (delta_t - distance) % 2 != 0:
            print("No")
            sys.exit()

        t, x, y = next_t, next_x, next_y

    print("Yes")

main()
```


# 感想
数学的な解き方は、学校で数学をがっつりやって法則性を見つけるのが、苦ではない人が挑戦してみてもいかなと思った。  
数学的に解くのは、競技プログラミングに思考がよりすぎる気がしたので、あんまり使わない気がする。
# 出来るようになったこと
1. AtCoderの基本的な考えが身についた
1. 難解な問題文から意訳する力
# 課題
1. 参考リンクから似た問題を解いてみる
1. LeetCodeにも挑戦する
# 参考文献
1. [AtCoder Beginners Selection をPythonで解く](https://szarny.hatenablog.com/entry/2018/06/06/_AtCoder_Beginners_Selection_%E3%82%92Python%E3%81%A7%E8%A7%A3%E3%81%8F)
1. [Atcoderの過去問精選10問をpythonで解いてみた！](https://qiita.com/toshi_machine/items/e556d5e2a292a9c9cdfe)
1. [AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)
1. [AtCoder に登録したら解くべき精選過去問 10 問を別解で解いてみた](https://qiita.com/259_Momone/items/991d31ccc1f830a1d578)
1. [AtCoder Beginners SelectionをPythonで解いてみた](http://okkah.hateblo.jp/entry/2019/11/25/191628)