見出し画像

『AtCoderに登録したら解くべき精選過去問10問』をPythonで解く(前編)


・AtCoder精進日記
・初学者(2020/04/10〜現在)
・使用言語:Python
・A-D問題中心
・目標:緑

間違いなどあればどんどん指摘して下さい!

2020/04/11分

どうも南無南無です!今回はけんちょんさん(@drken1215)の精選過去問10問からやってきます。まずは前半5問から

ABC086A

感想:特になし

サンプルコード:

A,B = map(int,input().split())

if (A*B) % 2 == 1:
   print('Odd')
else:
   print('Even')

ABC081A

感想:分けて書いてたけど、これはワンコードで書いたほうが分かりやすいかも

サンプルコード:

S = input()

print(S.count('1'))


ABC081B

感想:all()を初めて使用した。

※いずれかの要素がTrueか判定: any(), すべての要素がFalseか判定: not any()

サンプルコード:

N = int(input())
A = list(map(int, input().split()))

count = 0
while all(i % 2 == 0 for i in A):
   A = [i/2 for i in A]
   count += 1
print(count)

別解:2進数に変換してからする方法

n = input()
a = list(map(int, input().split()))
ans = float('inf')
for i in a:
 ans = min(ans, len(bin(i)) - bin(i).rfind('1') - 1)
print(ans)
引用元:https://note.com/keisuke_funabiki/n/nec9df628f77c#Vyjlp

ABC087B

感想:数学的な解釈は出来たが、初見で上手いコーディングが思いつかず。他人のサンプルコードを見ると容易に理解できたので練習の問題かも?全探索のコーディングが弱いので練習必須。

サンプルコード:

A, B, C, X = [int(input()) for i in range(4)]

ans = 0
for a in range(A+1):
   for b in range(B+1):
       for c in range(C+1):
           if a*500 + b*100 + c*50 == X:
               ans += 1
print(ans)

ABC083B

感想:初見失敗。数字を文字列に変換するというアイデアが思いつかず。

サンプルコード:

N,A,B=map(int,input().split())

ans = 0
for i in range(N+1):
   if A <= sum(map(int, list(str(i)))) <= B:
       ans += i
print(ans)

まとめ

・087Bと083B初見失敗
・コーディングが安定しないのでリーダブルコード買ったほうがいい気がする
・全探索が弱点
・数値⇔文字列の変換も今後要チェック
・慣れてれば解けそうな問題ばかりでくやしい
参考:
AtCoder Beginners Selection 徹底解説 【Python】






この記事が気に入ったらサポートをしてみませんか?