[AtCoder]ABC081B – Shift only [Ruby]

プログラミング

問題

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

入力例1
3
8 12 40
出力例1
2

入力例2
4 5 6 8 10
出力例2
0

自分の回答

def Shiftonly(numbers)
  count = 0
  counts = []
  numbers.each do |num|
    while num % 2 == 0 do
      num = num / 2
      count = count + 1
    end
    counts = counts.push(count)
    count = 0
  end
  p counts.min
end

amount = gets.chomp.to_i
numbers = gets.chomp.split(" ").map(&:to_i)
Shiftonly(numbers)

原理としては、配列から一つ(num)取り出して、それに対してひたすら2で割っていきます。2で割り切れなくなったところで、その回数(count)をcountsという配列に入れます。

例えば8という数字だと、8=>4=>2=>1となるので、countは3となります。

最終的に、countsの配列の中の一番小さい数字を出力すれば、答えとなります。

この問題の難しいところは、問題文だと、配列の全体を2で割っているところです。同じようにしようとしても自分では思いつきませんでした。なので、自分は一つずつ取り出して、2で割った数をカウントして、カウント数の最小のものを求めるというやり方をしてます。この発想の転換が肝でした。

この問題はBクラスなのですが、難易度がグッと上がった気がしますね。問題を読んだだけでは、すぐに何をすれば良いか思いつきません。また、数の個数Nを入力させるのですが、それも使っていません。Nを使えば、もっと楽にできるのでしょうか?

問題へのリンク

ABC081B - Shift only
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
タイトルとURLをコピーしました