第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(旦那)は、フラグ管理するよりは、こちらの方が良いと思っています。まぁ、時と場合によっては、フラグ管理の方が良いパターンもあると思いますが。

引き続き、よろしくお願いいたします!

Python学習,Python,paiza

Posted by LeoSaki