第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 の模範解答に近いものになっている。解答を得られたらループを抜ける処理を忘れないように。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません