【python】AtCoderに挑戦しよう③

こんにちは!(^^)!

それでは今回も、AtCoder Beginners Selectionやっていきたいと思います!

今回は、4問目を解説していきたいと思います。

Shift only

【問題文】

黒板にN個の正の整数A₁,・・・,Anが書かれています。

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

・黒板に書かれている整数全てを、2で割ったものに置き換える。

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

【制約】

・1≦N≦200

・1≦Ai≦10⁹

【入力】

入力は以下の形式で標準入力から与えられる。

N
A₁ A₂ ... An

【出力】

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

【入力例】

3
8 12 40

【出力例】

2

最初、黒板には[8,12,40]が書かれています。このとき、書かれている整数は全て偶数なので、操作を行うことができます。

1回操作を行ったあと、黒板には[4,6,20]が書かれています。再び、書かれている整数はすべて偶数なので、操作を行うことができます。

2回操作を行った後、黒板には[2,3,10]が書かれています。この時、奇数3が書かれているため、これ以上操作を行うことはできません。

よって、すぬけ君は最大で2回操作を行うことができます。

【解答例】

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

count=0

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

print(count)

それでは解説していきます。

一行目はinput()で全部の数字の数の入力を受け取ります。

二行目もいつも通りmap()を使って複数の値を受け取っていますが、今回の問題では値がいくつ入力されるか分からないので、list()関数で入力された値をリストに収納し、Bに代入しています。map()についてはこちらの記事で紹介していますのでもし分からない方がいれば参考にしてください!

AtCoderに挑戦しよう①

その次には、出力に使うcountを用意しています。この後で操作を行える回数を記録していくので、最初は0を代入してあります。

ここからはwhileを使った繰り返し処理に移っていきます。

whileは、そのあとに続く論理式がTrueである限り決められた処理を繰り返し行います。ここではall()関数と組み合わせて使っていますね。

all()関数は、引数に指定した要素が全てTrueであるときにTrueを返す関数です!

リストBから順番に値を取り出して2で割り、すべての数字でその余りが0の時、つまり、リストBの値がすべて偶数の時、all()はTrueを返します。

all()がTrueのときwhileによって指定の処理が実行されます。それによってcountに1が足され、リストBの値をすべて2で割ってリストBの値を更新しています。このリスト更新の際には、リスト内包表記という書き方を用いています。この書き方についてはこの記事の最後に解説していますので是非ご覧ください!

これによって、whileがTrueの時、すなわちリストBの中の値がすべて偶数の時にその中の値を2で割ったものに置き換えることができ、その回数を数えることができます。

そして、whileの論理式がFalseになった時、すなわちもう操作を行うことができなくなった時にwhileの繰り返し処理が終わり、その時のcountの値をprint()で出力することで、この問題をクリアすることができます。

all(),any()

今回の問題ではall()を使用しました。これは、引数に指定したすべての要素がTrueの時にTrueを返す関数でしたね。これに似た関数として、any()があります。any()は、引数に指定した要素のいずれかがTrueの時にTrueを返す関数です。すべての要素がFalseの時に限り、Falseを返します。

リスト内包表記

リスト内包表記では、for-inの構文を[]の中に書いてイテラブルなオブジェクトから新しいリストを作ることができます。イテラブルとは、そのオブジェクトから順に一個ずつ要素を取り出すことができるもののことを言います。

リスト内包表記の書式は以下のようになります。

[式 for 変数 in イテラブル]

それでは例を見てみましょう。

>>> numbers=[1,2,3,4,5]
>>> N=[i*2 for i in numbers]
>>> print(N)
[2, 4, 6, 8, 10]

numbersに収納されている値を、リスト内包表記によってすべて2を掛けた上でNという新しいリストに代入することができました。iという変数を使って最初の式を書いていることに注目してください。

終わりに

AtCoder Beginners Selectionの問題も少しずつ難しくなってきましたね。ですが、一文一文しっかりと解読していけば理解できるはずです!一緒に頑張っていきましょう。

では(^^)/

 

次の記事

【python】AtCoderに挑戦しよう④

“【python】AtCoderに挑戦しよう③” への1件の返信

コメントを残す

メールアドレスが公開されることはありません。