第97回【Python】インデックス取得、多重ループ

現在取り組んでいるのは、paiza ラーニング問題集「C ランクレベルアップメニュー」になります。

はじめに

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

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

肩こり首こりがひどいのですが、頸椎椎間板ヘルニアを患っているのでマッサージもままなりません。磁気ネックレスってどうなんでしょう。試してみようか迷います。が、首周りに何かをつけるのは苦手でした。

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

インデックス取得

1 から n まで番号が付けられた人々がいます。 i 番目の人の財産は a_i 円です。金額 k が与えられるので(k は a_1, …, a_n のいずれか)、財産が k 円である人の番号を出力してください。ただし、そのような人が複数いる場合には、そうした人々の中で最も小さい番号を出力してください。

n
a_1
...
a_n
k

1 行目には正整数 n 、 2 行目から (n + 1) 行目には n 個の整数 a_1, …, a_n が改行区切りで与えられ、 (n + 2) 行目には整数 k が与えられます。


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

・n および各 a_i (1 ≤ i ≤ n) は 1 以上 50 以下の整数
・k は a_1, …, a_n のいずれか

また、財産が k 円である人は、必ず1人以上いるとします。


入力例

2
5
6
6

出力例

2

index で取得できるのは、最も小さい添え字なので、要件に合致している。ただし、インデックス番号は 0 から始まるので +1 をしないといけない。

Python
N = int(input())
A = [int(input()) for _ in range(N)]
K = int(input())
print(A.index(K) + 1)
VBA
N = Cells(1, 1)
Dim A() As Integer
ReDim A(N - 1)
For i = 0 To N - 1
    A(i) = Cells(i + 2, 1)
Next
K = Cells(N + 2, 1)
For i = LBound(A) To UBound(A)
    If A(i) = K Then
        Debug.Print i + 1
        Exit For
    End If
Next

多重ループ

m 個の文字 c_1, …, c_m と、 n 個の文字列 S_1, …, S_n が与えられます。各 c_i (1 ≤ i ≤ m) について、各 S_j (1 ≤ j ≤ n) に c_i が出現するかをそれぞれ調べ、出現する場合は “YES" を、そうでない場合には “NO" を、そのつど出力してください。c_1 が S_1 に出現するかどうか、 c_1 が S_2 に出現するかどうか、 … 、 c_1 が S_n に出現するかどうか、 c_2 が S_1 に出現するかどうか、 c_2 が S_2 に出現するかどうか、 … 、 c_2 が S_n に出現するかどうか、 … 、 c_m が S_1 に出現するかどうか、 c_m が S_2 に出現するかどうか、 … 、 c_m が S_n に出現するかどうか、という順番で m * n 回出力してください。

m
c_1
...
c_m
n
S_1
...
S_n

1 行目に正整数 m が、 2 行目から (m + 1) 行目では文字 c_1, …,c_m が、 (m + 2) 行目に正整数 n が、 (m + 3) 行目から ( m + n + 2) 行目では文字列 S_1, …, S_n が、それぞれ改行区切りで与えられます(入力は全部で (m + n + 2) 行)。


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

・1 ≤ m, n ≤ 50
・各 c_i, S_j (1 ≤ i ≤ m, 1 ≤ j ≤ n) はそれぞれアルファベット大文字あるいは小文字からなる文字、文字列
・各 S_j (1 ≤ j ≤ n) の長さは 1 以上 10 以下


入力例

1
a
2
paiza
kyoko

出力例

YES
NO

よく問題文を読んで、順番を間違いないようにする。

Python
m = int(input())
C = [input() for _ in range(m)]
n = int(input())
S = [input() for _ in range(n)]
for c in C:
    for s in S:
        if c in s:
            print("YES")
        else:
            print("NO")
VBA
M = Cells(1, 1)
Dim C() As String
ReDim C(M - 1)
For i = 0 To M - 1
    C(i) = Cells(i + 2, 1)
Next
N = Cells(M + 2, 1)
Dim S() As String
ReDim S(N - 1)
For i = 0 To N - 1
    S(i) = Cells(M + 3 + i, 1)
Next
For Each ch In C
    For Each st In S
        If InStr(st, ch) > 0 Then
            Debug.Print "YES"
        Else
            Debug.Print "NO"
        End If
    Next
Next

最後に

Python の内包表記を利用するとスッキリ書けて見やすい。VBA の場合、こうなってくると、関数化しようかとか考えてしまう。「同じことをするなら関数化」を考えるのが職人・・・なのか?

最初に取り組んだ、「インデックス取得」の問題では、VBA で書いた方が Python の模範解答に近いものになっている。解答を得られたらループを抜ける処理を忘れないように。

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

Python学習,Python,paiza

Posted by LeoSaki