第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]の順になるらしい。
おまけ
データサイエンス・機械学習を勉強し、記事にするための書籍代などに利用したいと考えています。サポートいただけると嬉しいです。