AtCoder Beginners Selection ABC081B – Shift onlyをpythonで解いてみた

本サイトABC081B – Shift onlyへは以下から

問題:Shift only

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

制約

  • 1≤N≤200
  • 1≤Ai≤109

入力

N
A1 A2 ... AN

出力

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

入力例 1

3
8 12 40

出力例 1

2

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

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

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

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

入力例 2

4
5 6 8 10

出力例 2

0

入力例 3

6
382253568 723152896 37802240 379425024 404894720 471526144

出力例 3

8

解答例

N = int(input())

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

count = 0

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

print(count)

解説

この問題は、与えられた整数のリストがすべて偶数である限り、それらの整数を2で割り続ける操作を最大で何回行えるかを求めるものです。

以下の手順で問題を解くことができます。

  • 入力の受け取り:
    • int(input())を使用して、黒板に書かれている整数の数Nを受け取ります。
    • list(map(int, input().split()))を使用して、黒板に書かれているN個の整数をリストAとして受け取ります。
  • 初期化:
    • countを0に初期化します。これは、操作を行った回数をカウントするための変数です。
  • 操作の実行:
    • whileループを使用して、リストAのすべての要素が偶数である限り以下の操作を繰り返します:
      • all(a % 2 == 0 for a in A):リストAのすべての要素が偶数であるかどうかを確認します。
      • [a // 2 for a in A]:リストAのすべての要素を2で割り、新しいリストAを作成します。
      • count += 1:操作を1回行ったので、カウントを1増やします。
  • 結果の出力:
    • print(count)を使用して、操作を行った回数を出力します。

以下は、この問題を解くためのPython3のプログラムです。

# 整数Nを入力として受け取る
N = int(input())

# N個の整数を入力として受け取る
A = list(map(int, input().split()))

# 操作の回数を初期化
count = 0

# すべての整数が偶数である限りループを続ける
while all(a % 2 == 0 for a in A):
    # 各整数を2で割る
    A = [a // 2 for a in A]
    # 操作の回数をインクリメント
    count += 1

# 結果を出力
print(count)

while all(a % 2 == 0 for a in A):について詳しく解説します。

a % 2 == 0 for a in A は、リスト内包表記の一部として使用されるPythonの構文です。この構文を使用すると、リストAの各要素に対して何らかの操作を行い、新しいリストを生成することができます。

具体的には、a % 2 == 0 for a in Aは、リストAの各要素aに対して、aが偶数であるかどうかを確認します。a % 2は、aを2で割った余りを返します。したがって、a % 2 == 0は、aが偶数である場合にTrueを返し、奇数である場合にFalseを返します。

この構文をall()関数と組み合わせると、リストAのすべての要素が偶数であるかどうかを確認することができます。all()関数は、与えられたイテラブル(この場合はリスト内包表記の結果)のすべての要素がTrueである場合にTrueを返し、それ以外の場合はFalseを返します。

したがって、all(a % 2 == 0 for a in A)は、リストAのすべての要素が偶数である場合にTrueを返し、1つ以上の要素が奇数である場合にFalseを返します。

この構文を使用すると、リストのすべての要素に対して条件を確認し、その結果に基づいて処理を行うことができます。

次の問題へ

前の問題へ

一覧へ

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

雇われのシステムエンジニアです。
普段は車載ECUのセキュリティー分野に従事しております。

■保有資格
Salesforce 認定 Platform アプリケーションビルダー
Salesforce 認定 Platform デベロッパー

コメント

コメントする

目次