第5回 素人のAtCoder日記(Beginners SelectionのB問題一つ目)

問題



自分の考え

偶数かの判定はA問題の2つ目と一緒でいい。回数はwhile文で回してiterationの数を増やしていけばいけるかな。あとはそれらの制御構造を考えればいいのか。

とりあえず初期入力はこれでいいはず。

N = int(input())
data_list = list(map(int, input().split(' ')))


このリストって更新しなきゃだけど、新たに毎回リスト用意するのと、2で割ったやつを入れなおすのどっちがいいかな。

とりあえず各データの偶奇を判別してみた。すべて偶数の時だけ実際に2で割るステップに入る。偶数のとき0とし、奇数を1とすれば、これらの合計はすべて偶数の時のみ0となるので次のステップに進めるか判別できる。(for文から抜ける用に書いとく)

# それぞれのデータの偶奇の判定
whether_even_list = [0]*N
for i_datalist in range(N):
   if data_list[i_datalist]%2 == 0:
       whether_even_list[i_datalist] = 0
   else:
       whether_even_list[i_datalist] = 1

# for文から抜けるため
if sum(whether_even_list) != 0:
    break
else:
    continue


あとはwhile文とcounterをつけるだけ(結構苦労した)

counter = 0
while 1>0: #適当に無限ループ
   # それぞれのデータの偶奇を判別
   whether_even_list = [0]*N
   for i_datalist in range(N):
       if data_list[i_datalist]%2 == 0:
           whether_even_list[i_datalist] = 0
       else:
           whether_even_list[i_datalist] = 1
   # すべてのデータが偶数なら処理を続ける  
   if sum(whether_even_list) != 0:
       break
   else:
       counter = counter + 1
   
       # 2で割った値でリストを更新
       for i_datalist in range(N):
           data_list[i_datalist] = int(data_list[i_datalist]/2)
       #print(data_list)
       continue
print(counter)


通った

N = int(input())
data_list = list(map(int, input().split(' ')))
counter = 0
while 1>0: #適当に無限ループ
  # それぞれのデータの偶奇を判別
  whether_even_list = [0]*N
  for i_datalist in range(N):
      if data_list[i_datalist]%2 == 0:
          whether_even_list[i_datalist] = 0
      else:
          whether_even_list[i_datalist] = 1
  # すべてのデータが偶数なら処理を続ける  
  if sum(whether_even_list) != 0:
      break
  else:
      counter = counter + 1
  
      # 2で割った値でリストを更新
      for i_datalist in range(N):
          data_list[i_datalist] = int(data_list[i_datalist]/2)
      #print(data_list)
      continue
print(counter)


他の人の解答

スマートだなあ。この方(tkr1205)のツイッター見たらまだB3だった。すごいい。


こんな感じで条件を内包した(?)形で書けると、短いし理解もしやすくてええな。速度的にも有利らしい。


メモ

リスト内包
[i for i in range(10)] のように書く(辞書型もOK)

後置if
[i for i in range(10) if 条件式] のように書ける(リスト内包のみ結果的に書ける。実際はfor文に含まれてるだけ)
if ~ else を含むfor文の場合は、[i if ~ else for]の順になるらしい。


おまけ



データサイエンス・機械学習を勉強し、記事にするための書籍代などに利用したいと考えています。サポートいただけると嬉しいです。