背景
入社試験のプログラミングテスト対策のために、勉強しようと思った。そこで、日本語で多くの解説が載っているサイトとして、AtCoderがあったため勉強する。
目的
プログラミングテストの対策のために勉強する
はじめに
プログラミングテストを受ける上で、多くの解説があるサイトが、自分の勉強につながると思った。
そのため、日本語のコミュニティで、プログラミングテストを多く実施している所を探していたところ、AtCoderがあったため、勉強している。
要件定義
- AtCoder Beginners Selectionをとく
- 関連問題をとく
- 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で失敗したので、最初の回答を使うのがおすすめです。
Python
print(input().count('1'))
### 別解2
数学力が試される導き方
あんまりおすすめじゃないです。
数学が得意な人は、好きな書き方かも。
print(int(input())%9)
## 第3問: [ABC 081 B - Shift Only](https://atcoder.jp/contests/abc081/tasks/abc081_b)
```Python
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()
感想
数学的な解き方は、学校で数学をがっつりやって法則性を見つけるのが、苦ではない人が挑戦してみてもいかなと思った。
数学的に解くのは、競技プログラミングに思考がよりすぎる気がしたので、あんまり使わない気がする。
出来るようになったこと
- AtCoderの基本的な考えが身についた
- 難解な問題文から意訳する力
課題
- 参考リンクから似た問題を解いてみる
- LeetCodeにも挑戦する