第163回【Python】指定された値の個数、指定された値の位置 1

現在取り組んでいるのは、paiza ラーニング問題集「線形探索メニュー」になります。

はじめに

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

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

今回からは、定番アルゴリズムの習得から「線形探索メニュー」に挑戦しようと思います。定番アルゴリズムって問題を読めばああ、って思うけれど、線形探索って言われてもいまいちぱっとしない。これはちゃんと学習した方が良さそうです。

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

指定された値の個数 (paizaランク D 相当)

整数 n と、数列 a_1, … , a_n と、整数 k が与えられます。

a_1, … , a_n のうち k は何個あるかを求めてください。

n
a_1 a_2 ... a_n
k

・ 1行目に、数列の長さを表す整数 n が与えられます。
・ 2行目に、数列の値 a_i が半角スペース区切りで与えられます。
・ 3行目に、整数 k が与えられます。


期待する出力

n 個の整数 a_1, … , a_n のうち k が何個あるかを出力してください。


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

・ 入力は全て整数
・ 1 ≦ n ≦ 1,000
・ -100 ≦ a_i ≦ 100
・ -100 ≦ k ≦ 100


入力例

5
-3 2 0 -1 2
2

出力例

2

Count でもいい気がするのだけれど、なんか正攻法? でいってみようと思う。

Python
n = int(input())
A = [int(x) for x in input().split()]
k = int(input())

cnt = 0
for a in A:
    if a == k:
        cnt += 1
        
print(cnt)
VBA
Sub sequence_search_problems_search_value_step0()

    N = Cells(1, 1)
    temp = Split(Cells(2, 1), " ")
    k = Cells(3, 1)
    
    Dim A()
    ReDim A(N - 1)
    
    For i = 0 To N - 1
        A(i) = Val(temp(i))
    Next
    
    cnt = 0
    For Each v In A
        If v = k Then
            cnt = cnt + 1
        End If
    Next
    
    Debug.Print cnt
    
End Sub

指定された値の位置 1 (paizaランク D 相当)

整数 n と、数列 a_1, … , a_n と、整数 k が与えられます。

整数 k が数列の何番目にあるかを求めてください。なお、最初の要素 (a_1) を 1 番目とします。

ただし、数列に整数 k が含まれていない場合は、0 を出力してください。

また、数列に整数 k が複数含まれている場合は、数列を先頭から順に見たときに最初に現れる k が数列の何番目にあるかを求めてください。

n
a_1 a_2 ... a_n
k

・ 1行目に、数列の長さを表す整数 n が与えられます。
・ 2行目に、数列の値 a_i が半角スペース区切りで与えられます。
・ 3行目に、整数 k が与えられます。


期待する出力

整数 k が数列の何番目にあるかを出力してください。
ただし、数列に整数 k が含まれていない場合は、0 を出力してください。
また、数列に整数 k が複数含まれている場合は、数列を先頭から順に見たときに最初に現れる k が数列の何番目にあるかを出力してください。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


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

・ 入力は全て整数
・ 1 ≦ n ≦ 1,000
・ -100 ≦ a_i ≦ 100
・ -100 ≦ k ≦ 100


入力例

5
-3 2 0 -1 2
2

出力例

2

これも、Index でいい気がするのだけれど、なんか正攻法? でいってみようと思う。

Python
n = int(input())
A = [int(x) for x in input().split()]
k = int(input())

ans = -1
for i in range(n):
    if A[i] == k:
        ans = i
        break
        
print(ans+1)
VBA
Sub sequence_search_problems_search_value_step1()

    N = Cells(1, 1)
    temp = Split(Cells(2, 1), " ")
    k = Cells(3, 1)
    
    Dim A()
    ReDim A(N - 1)
    
    For i = 0 To N - 1
        A(i) = Val(temp(i))
    Next
    
    ans = -1
    For i = LBound(A) To UBound(A)
        If A(i) = k Then
            ans = i
            Exit For
        End If
    Next
    
    Debug.Print ans + 1

End Sub

最後に

メニューの名称が線形探索なので、先頭から順番に探索をしての結果を求めてみました。模範解答もこんな感じだったので、きっと正しいと信じてる。

2 問目は、最初に 0 を入れておくか、-1 を入れておいて最後に +1 を行うか、迷いました。多分、For 文の途中で値をごちゃごちゃするよりもいいのかなぁ。

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

PythonPython,paiza,学習

Posted by LeoSaki