AtCoder ABC 081 B – Shift only Python解説

スポンサーリンク

Shift only

黒板に N 個の正の整数A1​,…,ANが書かれています.
すぬけ君は,黒板に書かれている整数がすべて偶数であるとき,次の操作を行うことができます.

黒板に書かれている整数すべてを,2 で割ったものに置き換える.

すぬけ君は最大で何回操作を行うことができるかを求めてください.

AtCoder Beginner Contest 「Shift only」

整数すべて2で割り切れたらカウントを増やし、いずれかの整数が2で割り切れなくなったらそこで操作を終了する。愚直に行くとfor文で整数を2で割っていき、割り切れなくなるまでwhile文でループさせることが考えられます。

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

cnt = 0
flag = True

while flag:
    for i in range(n):
        if a[i] % 2 == 0:
            a[i] //= 2
        else:
            flag = False
            break
    
    if flag:
        cnt += 1
    else:
        break
    
            
print(cnt)

flagで割り切れているかを管理し、整数すべてを2で割ったものに置き換えたらcnt+1しています。
flag管理やbreakの置き場所が複雑になりそうなら次の方法もあります。

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

def division(n):
    cnt = 0
    while n % 2 == 0:
        n //= 2
        cnt += 1
    return cnt
# *1
print(min(map(division, a)))

2で割り切れるか関数を定義し割り切れた回数をreturnする。(*1)定義した関数はmap関数を使い、配列の要素すべてで実行するので、最後はmin関数で割り切れた最小値を出力して完了です。