第96回【Python】3の倍数のカウント、フラグ管理
現在取り組んでいるのは、paiza ラーニング問題集「C ランクレベルアップメニュー」になります。
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
Python をゼロから勉強してみよう、のコーナー 96 回目です。
前回、社内が暑いと書いていたら、誰ともなく早くからクーラーをつけてくれるようになりました。しかし知っている。サーバーに一番近い席が一番暑くて地獄なことを。以前、そこに座っていたから。
それでは、今日も頑張ってみようと思います。
3の倍数のカウント
正整数 n と、 n 個の整数 a_1, …, a_n が半角スペース区切りで与えられます。
与えられた整数の中に 3 の倍数がいくつあるかを数え、出力してください。
n
a_1 a_2 ... a_n
1 行目に正整数 n が、 2 行目に n 個の整数 a_1, …, a_n が半角スペース区切りで与えられます。
すべてのテストケースにおいて、以下の条件をみたします。
・n および各 a_i (1 ≤ i ≤ n) は 1 以上 50 以下の整数
入力例
3
1 6 9
出力例
2
またとても基本っぽい問題に戻りました。
Python
N = int(input())
A = [int(x) for x in input().split()]
cnt = 0
for a in A:
if a % 3 == 0:
cnt += 1
print(cnt)
VBA
N = Cells(1, 1)
A = Split(Cells(2, 1), " ")
cnt = 0
For Each v In A
If v Mod 3 = 0 Then cnt = cnt + 1
Next
Debug.Print cnt
フラグ管理
正整数 n と n 個の整数 a_1, …, a_n が改行区切りで与えられるので、各 a_i (1 ≤ i ≤ n) が 7 であるか判定し、 a_1, …, a_n の中に 7 がひとつでも含まれていた場合には “YES" を、そうでない場合(7 がひとつも含まれていなかった場合)には “NO" を出力してください。
n
a_1
...
a_n
1 行目には正整数 n が与えられ、 2 行目から (n + 1) 行目には n 個の整数 a_1, …, a_n が改行区切りで与えられます。
すべてのテストケースにおいて、以下の条件をみたします。
・ n および各 a_i (1 ≤ i ≤ n)は 1 以上 50 以下の整数
入力例
3
4
11
35
出力例
NO
フラグ管理はしばしば頭を悩ます問題となります。Python だと、for 文の最後に else をつけることができて、途中で break しなければ else までいくことになるのでフラグ管理の必要がなくなる。これを知ったときは目からうろこだった。
Python
N = int(input())
for _ in range(N):
a = int(input())
if a == 7:
print('YES')
break
else:
print('NO')
VBA
N = Cells(1, 1)
flg = False
For i = 1 To N
If Cells(i + 1, 1) = 7 Then
flg = True
Exit For
End If
Next
If flg Then
Debug.Print "YES"
Else
Debug.Print "NO"
End If
VBA(最近よく使う方法)
N = Cells(1, 1)
Do
For i = 1 To N
If Cells(i + 1, 1) = 7 Then
Debug.Print "YES"
Exit Do
End If
Next
Debug.Print "NO"
Loop Until True
最後に
フラグ処理で書いてあるコードで「条件に合った場合ループを抜ける(break なり exit なし)」という処理を書いていないコードを見かけます。最大 1,000,000 回ループをする必要があって、1 回目で条件に一致しても、1,000,000 回ループを経てから True であると判断するのは無駄な気がします。
Python の for ~ else 文は便利です。海外の掲示板でいろいろと議論されているようですが、LeoSaki(旦那)は、フラグ管理するよりは、こちらの方が良いと思っています。まぁ、時と場合によっては、フラグ管理の方が良いパターンもあると思いますが。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません