第75回【Python】同値判定、終了判定、終了判定 2

現在取り組んでいるのは、paiza ラーニング問題集「条件分岐メニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 75 回目です。

契約書類を作成しなければならないことがたまにあります。甲とか乙とか分かりづらいったりゃありゃしない。まぁ、くどくなったとしても、一文ごとに丁寧に主語述語を書く方が良いようなので。結果、大ボリュームの契約書類が完成するわけです。

それでは、今日も頑張ってみようと思います。

同値判定

整数N, 2 つの数列A, B が与えられます。 1 ≦ i ≦ N を満たす整数 i のうち、A_i と B_i が等しくなるような i の個数を求めてください。

N
A_1 A_2 ... A_N
B_1 B_2 ... B_N

すべてのテストケースにおいて、以下の条件をみたします。

・ N は 1 以上 100 以下の整数
・ A, B の各要素の値は 0 以上 100 未満


5
1 2 3 4 5
1 20 30 4 5

問題文が分かりづらい。LeoSaki(旦那)の読解力が足りないから? 最初、それぞれの配列から 1 以上 N 以下の値を取り出して、共通する値が幾つあるか、って問題と勘違いしていました。

Python
N = int(input())
A = list(map(int,input().split()))
B = list(map(int,input().split()))
cnt = 0
for i in range(N):
    if A[i] == B[i]:
        cnt += 1
print(cnt)

模範解答でもこれなんだけれど、配列の要素数がそもそも N より少ない場合はエラーが発生するような気がする。N が配列の要素数以下であるとはどこにも書かれてないしなぁ。

VBA
N = Cells(1, 1)
A = Split(Cells(2, 1), " ")
B = Split(Cells(3, 1), " ")
cnt = 0
For i = 0 To N - 1
    If A(i) = B(i) Then cnt = cnt + 1
Next
Debug.Print cnt

終了判定

長さ N の数列Aが与えられます。 1 つ目の要素から最も左にある奇数の要素の手前までの値の和を求めてください。
形式的には、A_iが奇数かつ、区間 [A_1, A_{i – 1}] がすべて偶数であるとき、

\sum_{j=1}^{i-1}{A_j}

を求めてください。

N
A_1 A_2 ... A_N

すべてのテストケースにおいて、以下の条件をみたします。

・ N は 1 以上 100 以下の整数
・ A の各要素の値は 0 以上 100 未満
・ A には奇数が 1 つ以上含まれます


5
2 4 6 8 1

これはわかりやすい。奇数が出たら足し算やめる、ってことですね。

Python
N = int(input())
A = list(map(int,input().split()))
ans = 0
for a in A:
    if a % 2 == 1:
        break
    ans += a
print(ans)
VBA
N = Cells(1, 1)
A = Split(Cells(2, 1), " ")
ans = 0
For Each v In A
    If v Mod 2 = 1 Then Exit For
    ans = ans + v
Next
Debug.Print ans

終了判定 2

2 以上の整数N, Kが与えられます。
「Nを 2 倍した数でNを更新する」という操作を何度か繰り返すことを考えます。
このとき, ちょうどある回数 M で N の値は K 以上になります。この時点で操作の繰り返しを終了することにします。

この繰り返しの回数Mを求めてください。(Mは 0 でも構いません)

例えば、Nを 2 、Kを 18 とします。
上記の操作を 3 回繰り返すと、N = 16 となります。
4 回くりかえすと、N = 32 となり、N >= K が成立します。ここで操作を終了し、最終的な操作の回数Mは 4 となります。

N K

すべてのテストケースにおいて、以下の条件をみたします。

・ N は 2 以上 100 以下の整数
・ K は N 以上 10,000 以下の整数


2 18

2 倍 2 倍って CM が記憶にある人は・・・LunaSaki(嫁)は知らないらしいです。

Python
N,K = map(int,input().split())
M = 0
while N < K:
    N *= 2
    M += 1
print(M)
VBA
NK = Split(Cells(1, 1), " ")
N = Val(NK(0))
K = Val(NK(1))
M = 0
Do While N < K
    N = N * 2
    M = M + 1
Loop
Debug.Print M

最後に

読解力も必要ということで。IPA の試験で、嫌というほど読解力が必要な問題にぶつかってきたけれど、まだまだだったか・・・。

世の中の保護者の方々、論理的思考だけではなく、国語もしっかり勉強させなければならないのです。結局のところ、学生時代に無駄だと思っていた勉強ってすべて重要で必要なんだと思います。Python のお勉強の締めに書くことではないなぁ。

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

PythonPython,paiza,学習

Posted by LeoSaki