たのしい工学

プログラミングを学んで、モノをつくりたいひと、効率的に仕事をしたい人のための硬派なブログになりました

【競技プログラミング:Python】Atcoder ABC081B – Shift only

   

以下、Atcoderの問題より

ーーーーーーーーーーーーーーーーーーーーーーーーー
ABC081B - Shift only
時間制限 : 2sec / メモリ制限 : 256MB

配点 : 200 点

問題文
黒板に N 個の正の整数 A1,…,AN が書かれています.

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

黒板に書かれている整数すべてを,2 で割ったものに置き換える.
すぬけ君は最大で何回操作を行うことができるかを求めてください.

制約
1≤N≤200
1≤Ai≤109
入力
入力は以下の形式で標準入力から与えられる。

N
A1 A2 ... AN
出力
すぬけ君は最大で何回操作を行うことができるかを出力せよ.

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

回答

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

この問題のミソ

all()

[2. 組み込み関数 — Python 3.6.5 ドキュメント]より(https://docs.python.jp/3/library/functions.html#all)

allの定義
iterable の全ての要素が真ならば (もしくは iterable が空ならば)  True を返します。以下のコードと等価です:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

「イテラブル」は「iterable」で「反復可能な」です。
for文などで反復できるものだと考えてください。

リスト内包表記

配列を用意して、appendしてもいいですが、それよりもリスト内包表記をつかったほうが、コードが簡潔かつ実行速度が速いです

内包表記公式ドキュメントはこちら

Atcoderサイト
https://atcoder.jp/?lang=ja

競技プログラミングをやることのよさは、実装力を養えることです。くりかえしやることでよく登場するfor文やif文の流れになれることができます。ちょうど受験数学の参考書をくりかえし解くことで、解法のパターンを身に着けることに似ています。いろいろな言語でやってOKなのが競技プログラミングのよいところです。ぼくはUdemyのpython講座をやってpythonの基礎を身に着けました。pythonをやるよさは、流行りのAI関連のライブラリが豊富なので、今後いろいろと応用させやすい言語であるところですね。実装力を身に着けたいひとは競技プログラミングをやるのは非常におすすめです。ぼくは学びたい言語があれば、教プロをやって、その言語に慣れるようにすることが多いですね。

ではでは!

 - アルゴリズム, プログラミング系, python