LoginSignup
22
29

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-22

はじめに

どーも、最近競プロをはじめた新人です。
@drkenさんの記事AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~に取り上げられている問題10問をPython3で解いてみました.AtCoderの入門として、非常に素晴らしい記事なので、興味のある方はぜひチェックしてください.
問題の詳細と一般的な解法は元の記事を参照してください.

第1問 ABC 086 A - Product

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

簡単なif-elseで解きました.

第2問 ABC 081 A - Placing Marbles

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

stringのcountを使えば楽.

第3問 ABC 081 B - Shift Only

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

内包表記を使いました.

第4問 ABC 087 B - Coins

A = int(input())
B = int(input())
C = int(input())
X = int(input())
res=0
for  i in range(A + 1):
    for j in range(B + 1):
        for k in range(C + 1):
            if 500*i + 100*j + 50*k == X:
                res += 1
print(res)

三重ループなので内包表記より全探索を使いました.

第5問 ABC 083 B - Some Sums

N, A, B = map(int, input().split())
res = 0
for i in range(N+1):
    if A <= sum([int(s) for s in str(i)]) <= B:
        res += i
print(res)

intとstringの相互変換を活用しました.

第6問 ABC 088 B - Card Game for Two

N = int(input())
l = list(map(int, input().split()))
l.sort(reverse=True)
print(sum(l[0::2]) - sum(l[1::2]))

sort来ましたね.

第7問 ABC 085 B - Kagami Mochi

N = int(input())
l = sorted([input() for _ in range(N)])
print(len(set(l)))

sortとsetの連携です.

第8問 ABC 085 C - Otoshidama

N, Y = map(int, input().split())
res = (-1, -1, -1)
for x in range(N + 1):
    for y in range(N + 1 - x):
        if N - x - y >= 0 and 10000*x + 5000*y + 1000*(N - x - y) == Y:
            res = (x, y, N - x - y)
print(res[0], res[1], res[2])

二重ループの例ですが、この解答はあまり好きではありません.

第9問 ABC 049 C - Daydream

given = ["dreamer", "dream", "eraser", "erase"]
S = input()
while len(S) > 0:
    judge = [S.endswith(i) for i in given]
    if any(judge):
        target = given[judge.index(True)]
        S = S[:-len(target)]
        if len(S) == 0:
            print("YES")
            break
    else:
        print("NO")
        break

ちょっと難しいですね、DPを使ったら楽かもしれません.

第10問 ABC 086 C -Traveling

N = int(input())
for _ in range(N):
    t, x, y = map(int, input().split())
    if x + y > t or (t + x + y)%2 != 0:
        print("No")
        quit()
print("Yes")

元記事の解説を参照しました.主に偶数と奇数の性質を使いました.

終わりに

入門なので、それほど複雑なコードではありません.他の言語と比べて,Pythonが遅いと言われますが、それほど大した問題ではないと思います.速度の方で気になる方もご心配なくPythonを使っていただければ大丈夫だと思います.

22
29
2

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
22
29