LoginSignup
2
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-04-21

背景

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

目的

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

はじめに

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

要件定義

  1. AtCoder Beginners Selectionをとく
  2. 関連問題をとく
  3. LeetCode60問をとく

環境

  • Windows10Pro
  • Python3.7
  • Anaconda

やった結果

第1問: ABC 086 A - Product

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

第2問: ABC 081 A - Placing Marbles

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で失敗したので、最初の回答を使うのがおすすめです。

print(input().count('1'))

別解2

数学力が試される導き方
あんまりおすすめじゃないです。
数学が得意な人は、好きな書き方かも。


print(int(input())%9)

第3問: ABC 081 B - Shift Only

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

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

mapを使うと便利に仕分けをすることが出来るということを知った。
初めて使った。

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

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

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

第8問: ABC 085 C - Otoshidama

連立方程式などを解くという数学的な技能を使う問題だった。

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

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

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

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

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

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

数学的な解き方

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 王道な解き方


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

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の基本的な考えが身についた
  2. 難解な問題文から意訳する力 # 課題
  3. 参考リンクから似た問題を解いてみる
  4. LeetCodeにも挑戦する # 参考文献
  5. AtCoder Beginners Selection をPythonで解く
  6. Atcoderの過去問精選10問をpythonで解いてみた!
  7. AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~
  8. AtCoder に登録したら解くべき精選過去問 10 問を別解で解いてみた
  9. AtCoder Beginners SelectionをPythonで解いてみた
2
3
0

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
2
3