LoginSignup
2
0

競プロの初めの10問を解いてみた

Posted at

AtCoder Beginners Selection

初心者向けの問題が10問厳選されており、始めるにはもってこいの問題集。

いろんな方が、書いてますが自分も取り組んでみた感想を書きます。

以下自己解答。
他にも色々な解法があるのですが、自分が解けた(答えを見て理解できた)範囲で書きます。

PracticeA - Welcome to AtCoder

# -*- coding: utf-8 -*-
# 整数の入力
a = int(input())
# スペース区切りの整数の入力
b, c = map(int, input().split())
# 文字列の入力
s = input()
# 出力
print(a+b+c,s)

ABC086A - Product


a,b= map(int,input().split())

if (a*b)%2:
  print('Odd')
else:
  print('Even')

ABC081A - Placing Marbles

s = str(input())
cnt = 0
for i in s:
  if i == '1':
    cnt+=1
print(cnt)

ABC081B - Shift only

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

ABC087B - Coins

a = int(input())
b = int(input())
c = int(input())
x = int(input())
print(
    sum(500*i+100*j+50*k==x for i in range(a+1)for j in range(b+1)for k in range(c+1))
)

sum関数に気づけるか、3重のforループになったけど通りました。

ABC088B - Card Game for Two


n=input()
a=list(map(int,input().split()))

a.sort(reverse=True)
al,bo=0,0
for i,v in enumerate(a):
  if i%2==0:
    al+=v
  else:
    bo+=v

print(al-bo)

ABC085B - Kagami Mochi

n = int(input())
hash = []
for _ in range(n):
  a = int(input())
  hash.append(a)
  
print(set(hash))

forをブランクで回せることに気づいた。

ABC085C - Otoshidama


n, y = map(int, input().split())
for i in range(n + 1):
    for j in range(n-i+1):
        if 10000*i + 5000 *j + 1000*(n-j-i) == y:
            print(i, j, n - i - j)
            exit()
print("-1 -1 -1")

ABC049C - 白昼夢


s = input()
# erを先にすること
list = ["eraser", "erase", "dreamer", "dream"]

for i in list:
  s = s.replace(i, "")
  
if s:
  print("NO")
else:
  print("YES")

これこそ、頭を使う問題。

ABC086C - Traveling

n = int(input())

prev_t, prev_x, prev_y = 0, 0, 0

for _ in range(n):
  t, x, y = map(int, input().split())
  
  dist = abs(x - prev_x) + abs(y - prev_y)
  time_diff = t - prev_t
  
  if dist > time_diff or (time_diff - dist) % 2 != 0:
    print("No")
    exit()
  
  prev_t, prev_x, prev_y = t, x, y

print("Yes")

Cは難しいので、今後もっと解いていきたいですね。

感想

正直難しい。全問解けたわけではないですが、解けたものもありました。
わからないものは、考えてもわからないので答えを見てしまいましたが
いろんな書き方があるし、知らない関数の使い方も学びました。

標準入力の取り方

input()で1つは取ることが可能。
ですが、連続するデータの取得方法に悩んだり、リストに入れることが最初は戸惑いました。

mapの使い方

標準入力の取得で頻繁に使うことになったmap
mapを使うとリストに関数を適用できるため、intを使い変換をしたりしました。
標準入力では必須になりがち。

内包表記の使いかた(結構頻繁に)

forで書くと複数行になるものがあるため、内包型で1行にまとめる。
これはリファクタリングで使えるなと感じました。

2
0
1

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
0