tmori’s blog

公開メモ帳くらいの感覚で書いています。技術系多め。日常少なめ。

Atcoder Beginner Contest 148 振り返り 【Python】

はじめに

AtCoder Beginner Contest 148の振り返りをします。
結果は4完でした。競プロを最近始めた知人もDまで解けていたので今回のコンテストは少し簡単だったのかもしれません。

atcoder.jp

A - Round One

提出したプログラム

a=int(input())
b=int(input())
 
abc_list = [a,b]
 
if not(1 in abc_list):
    print(1)
if not(2 in abc_list):
    print(2)
if not(3 in abc_list):
    print(3)

今までやったABC-A問題で一番難しかったかもしれない。僕は入力をリストに追加した後、リストに存在しない数字を出力するプログラムを書きました。絶対もっと簡単に解けるんだろうなと思いながらも、時間をかけたくなかったので考えるのを放棄することにしました。

他の人のプログラム(コード長が少ない人1)

print(6-int(input())-int(input()))

なにこのイケメンコード....。このコード書いた人は間違いなくイケメンに違いありません。

他の人のプログラム(コード長が少ない人2)

print(int(input())^int(input()))

最初見たとき意味がわかりませんでした。そもそもpythonハットがXOR(排他的論理和)っていうこと自体知りませんでした。 「でもなんで排他的論理和使ってるんだ?どゆこと?」と思って計算してみました。

2ビットに変換

  • 1 → 01

  • 2 → 10

  • 3 → 11

計算結果

  • 1 (01) xor 2 (10) = 11 → 3

  • 2 (10) xor 3 (11) = 01 → 1

  • 3 (11) xor 1 (01) = 10 → 2

🙄
イケメンすぎるのでこれ以上の解説はやめておきます。

B - Strings with the Same Length

提出したプログラム

N=int(input())
S,T=input().split()
 
for i in range(N):
    print(S[i], end="")
    print(T[i], end="")
print()

正直AよりBのほうが簡単でした。僕はrangeでゴリ押したんですけどzip使ったほうがスマートですね。

C - Snack

提出したプログラム

A,B=map(int,input().split())
 
def gcd(a, b):
    while b:
        a, b = b, a % b
    return a
    
def lcm(a, b):
    return a * b // gcd (a, b)
 
print(lcm(A,B))

2つの入力の最小公倍数が出力とわかれば一瞬で解ける問題でした。他の人も大体同じようなプログラムを書いていました。

D - Brick Break

提出したプログラム

N=int(input())
bricks=list(map(int,input().split()))
 
manzoku=1
hakai = 0
for i in range(N):
    if bricks[i] == manzoku:
        manzoku += 1
    else:
        hakai += 1
 
if hakai == N:
    print(-1)
else: 
    print(hakai)

先頭から1,2,3,4,5...を探し、それ以外をどんどん壊していくことが気がつければ実装はそんなに難しくない問題でした。僕の場合manzokuを1からはじめて選択したレンガがmanzokuと一致すればmanzokuを1増やす。manzokuと一致しなければhakaiを1増やす。最終的にhakaiの数を出力すれば完成です。また、N個全てをhakaiした場合は-1と出力しましょう。(人に見せるときは変な変数をつけないようにしましょう👍)

f:id:tmoribanner:20191227122646j:plain
砕いたら満足する図

E - Double Factorial

今回僕が解けなかった問題です。 この問題は 公式の解説 がとても分かりやすく、pythonにも変換しやすいので解説を省きます。

n = int(input())
ans = 0
a = 1
if n % 2 == 1:
    print(0)
else:
    for j in range(1,40):
        ans += (n // ((5**j)*10))
    n10 = n // 10
    print(ans+n10)

数学よりの問題だったので解きたかった...。

終わりに(余談)

レート戦は楽しい(ゲーム脳