Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

どーも、最近競プロをはじめた新人です。
@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を使っていただければ大丈夫だと思います.

edad811
趣味でPython3、機械学習、深層学習やっています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away