【AtCoder】過去問精選10問を解く【Python】

「AtCoderに登録したけれど、じゃあ何すればいいの?」という方向けに、有志の方が最初に解くべき10問をまとめてくれています。

Atcoderにも精選10問をまとめたページがあります。↓

https://atcoder.jp/contests/abs/tasks

今回は、こちらの10問を「Python」で解いたコードをまとめました。

詰まってしまって解けない、なんてときにご活用ください。

各問題のリンク先では、詳しい解説や別解を書いていますので興味がありましたらぜひ~。

提出コード例と簡単な解説

それぞれの問題の提出コード例と解説です。

第 1 問: ABC 086 A – Product (100 点)

【問題】ABC086A – Product

二つの整数a,bの積が、偶数か奇数かを調べます。

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

基本的な入力方法とif文の使い方を知っていれば解けますね。

詳しい解説

abc086a 【ABC086 A】「Product」を解く【Python3】

第 2 問: ABC 081 A – Placing Marbles (100 点)

【問題】ABC081A – Placing Marbles

「1」のマスがいくつあるかを求めます。

提出
s = input()
print(s.count('1'))

count()メソッドを使用して、「1」の出現回数をカウントします。

詳しい解説

【ABC081 A】「Placing Marbles」を解く【Python3】

第 3 問: ABC 081 B – Shift Only (200 点)

【問題】ABC081B – Shift only

「N 個の正の整数がすべて偶数だったとき、すべてを2で割ったものに置き換える」

という操作が何回できるかを調べます。

すべて操作する方法(*別解)もありますが、ここでは1つずつ操作して、最小のものを求めています。

提出
n = int(input())
a = list(map(int, input().split()))
ans = 100

for i in range(n):
    num = a[i]
    count = 0
    while(True):
        if num%2 == 0:
            num = num//2
            count += 1
        else:
            break
    if ans>count:
        ans = count

print(ans)

現在操作している数字numが奇数になるまで同じ操作を繰り返し、回数を数えます。

詳しい解説

【ABC081 B】「Shift only」を解く【Python3】

第 4 問: ABC 087 B – Coins (200 点)

【問題】ABC087B – Coins

500 円玉 A 枚、100 円玉 B 枚、50 円玉 C 枚持っているときに、合計金額が X 円になる方法が何通りあるか調べます。

提出
a, b, c, x = map(int, [input() for i in range(4)])
ans=0

for i in range(a+1):
    for j in range(b+1):
        for k in range(c+1):
            if i*500+j*100+k*50 == x:
                ans+=1

print(ans)

入力には内包表記を使用し、答えは全探索で調べています。

詳しい解説

【ABC087 B】「Coins」を解く【Python3】

第 5 問: ABC 083 B – Some Sums (200 点)

【問題】ABC083B – Some Sums

1 以上 N 以下の整数のうち、各桁の和が A 以上 B 以下であるものの総和を求めます。

提出
n, a, b = map(int, input().split())
ans = 0

for i in range(1,n+1):
    num = sum(map(int, str(i)))
    if a<=num<=b:
        ans += i

print(ans)

各桁の合計値を計算して、 A 以上 B 以下であるかを確認し、条件に合えば元の整数を解答に加えます。

詳しい解説

【ABC083 B】「Some Sums」を解く【Python3】

第 6 問: ABC 088 B – Card Game for Two (200 点)

【問題】ABC088B – Card Game for Two

Alice は Bob より何点多く取るか求めます。

提出
n = int(input())
a = sorted(list(map(int, input().split())), reverse=True)

alice = 0
bob = 0

for i in range(n):
    if i%2 == 0:
        alice += a[i]
    else:
        bob += a[i]

print(alice-bob)

2人が大きい順にカードを取ることと同じであるため、大きい順にソートし、Alice と Bob の点数に加えます。

詳しい解説

【ABC088 B】「Card Game for Two」を解く【Python3】

第 7 問: ABC 085 B – Kagami Mochi (200 点)

【問題】ABC085B – Kagami Mochi

X 枚の円形の餅をいくつ縦に積み重ねられるかを求めます。

提出
n = int(input())
d = [input() for i in range(n)]

print(len(set(d)))

重複しているものを削除し、長さを取得しています。

詳しい解説

【ABC085 B】「Kagami Mochi」を解く【Python3】

第 8 問: ABC 085 C – Otoshidama (300 点)

【問題】ABC085C – Otoshidama

青橋くんのお年玉の状況が、実際にありうるかどうか判定し、ありうる場合に候補を一つ出します。

提出
n, y = map(int, input().split())

for i in range(n+1):
    for j in range(n+1-i):
        if 10000*i+5000*j+1000*(n-i-j) == y:
            print(i, j, n-i-j)
            exit(0)

print("-1 -1 -1")

全探索では時間が足りないため、10000 円札、5000 円札の全パターンを判定しています。

詳しい解説

【ABC085 C】「Otoshidama」を解く【Python3】

第 9 問: ABC 049 C – Daydream (300 点)

【問題】ABC049C – 白昼夢

空文字列である T の末尾に「dream, dreamer, erase, eraser」のいずれかを追加することで、与えられた文字列 S と同じものができるかどうかを判定します。

提出
s = input().replace("eraser","").replace("erase","").replace("dreamer","").replace("dream","")

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

文字列 S が、4つの文字列の組み合わせで出来ているかどうかを調べます。

詳しい解説

【ABC049 C】「白昼夢」を解く【Python3】

第 10 問: ABC 086 C – Traveling (300 点)

【問題】ABC086C – Traveling

シカのAtCoDeerくんのプランが、実行可能かどうか判定します。

提出
n = int(input())
txy=[list(map(int,input().split())) for _ in range(n)]
p = [0,0,0]

for i in range(n):
    step = abs(txy[i][1]-p[1])+abs(txy[i][2]-p[2])
    time = txy[i][0]-p[0]
    if time>=step and (time-step)%2 == 0:
        p = txy[i]
        continue
    else:
        print("No")
        exit(0)

print("Yes")

一つ前の時刻から今の時刻までに進んだ距離を計算し、それが可能かどうか判定しています。

詳しい解説

【ABC086 C】「Traveling」を解く【Python3】

この後はどうする?

過去問精選10問を解いた後は、以下の記事もおすすめです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です