第81回【Python】ランダムアクセス、複数回のランダムアクセス、最大値と最小値、動的配列

現在取り組んでいるのは、paiza ラーニング問題集「データセット選択メニュー」になります。

はじめに

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

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

今回から新たに「データセット選択メニュー」に挑戦します。今から VBA で書くことに怯えています。めんどくさそう・・・。

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

ランダムアクセス

要素数 N の数列 A と数値 M が与えられます。A の M 番目の値を出力してください。

N M
A_1 ... A_N

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

・ 1 ≦ N ≦ 100
・ 1 ≦ M ≦ N
・ 1 ≦ A_i ≦ 100 (1 ≦ i ≦ N)


5 2
1 2 3 4 5

配列メニューなんかで、似たような問題にたくさん取り組んだ気がしますが。

Python
N,M = map(int,input().split())
A = [int(x) for x in input().split()]
print(A[M-1])
VBA
NM = Split(Cells(1, 1), " ")
N = Val(NM(0))
M = Val(NM(1))
a = Split(Cells(2, 1), " ")
Debug.Print a(M - 1)

複数回のランダムアクセス

要素数 N の数列 A と要素数 Q の数列 B が与えられます。 1 ≦ i ≦ Q の各 i について、i 行目に A の B_i 番目の値を出力してください。

N
A_1 A_2 ... A_N
Q
B_1 B_2 ... B_Q

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

・ 1 ≦ N ≦ 100
・ 1 ≦ Q ≦ 100
・ 1 ≦ A_i ≦ 100 (1 ≦ i ≦ N)
・ 1 ≦ B_i ≦ N (1 ≦ i ≦ Q)


入力例

5
10 20 30 40 50
3
2 4 1

出力例

20
40
10

ちょっとだけ変化球。でも、難しくはないと思う。

Python
N = int(input())
A = [int(x) for x in input().split()]
Q = int(input())
B = [int(x) for x in input().split()]
for b in B:
    print(A[b-1])
VBA
N = Cells(1, 1)
a = Split(Cells(2, 1), " ")
Q = Cells(3, 1)
b = Split(Cells(4, 1), " ")
For Each v In b
    Debug.Print a(v - 1)
Next

最大値と最小値

自然数 A, B, C が与えられます。(A, B, C の最大値) – (A, B, C の最小値)を答えてください。

A B C

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

・ 1 ≦ A, B, C ≦ 100


入力例

30 50 10

出力例

40

ちょっとだけ変化球。でも、難しくはないと思う。最初に max min を利用した方法を思いついたけれど、確か、以前、max min は少し遅いということを確認した気がする。

Python(max と min を利用した)
ABC = [int(x) for x in input().split()]
print(max(ABC) - min(ABC))
Python(sort を利用した)
ABC = [int(x) for x in input().split()]
ABC.sort()
print(ABC[2] - ABC[0])
VBA
Dim ABC() As Integer
Set obj = Application.WorksheetFunction
temp = Split(Cells(1, 1), " ")
For i = 0 To UBound(temp)
    ReDim Preserve ABC(i)
    ABC(i) = temp(i)
Next
Debug.Print obj.Max(ABC) - obj.Min(ABC)

動的配列

N 個の要素からなる数列 A が与えられます。数列 A に対し、次の 3 つの操作を行うプログラムを作成してください。

・ push_back x : A の末尾に x を追加する
・ pop_back : A の末尾を削除する
・ print : A を半角スペース区切りで1行に出力する

例えば、入力例 1 において、数列 A は最初「1 2 3」です。最初の操作は「push_back 10」なので、末尾に 10 を追加して「1 2 3 10」となります。 2 つ目の操作は「push_back 12」なので、「1 2 3 10 12」となります。 3 つ目の操作は「print」なので「1 2 3 10 12」を出力します。 4 つ目の操作は「pop_back」なので末尾の「12」を削除して、「1 2 3 10」となります。最後の操作は「print」なので「1 2 3 10」を出力します。

N Q
A_1 A_2 A_3 ... A_N
query_1
query_2
...
query_Q

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

・ 1 ≦ N ≦ 100
・ 1 ≦ Q ≦ 100
・ 1 ≦ A_i ≦ 100 (1 ≦ i ≦ N)
・ query_i は 0 x または 1 または 2
・ 1 ≦ x ≦ 100
・ pop_back 操作が指定される際、Aの要素数は 1 以上


入力例

3 5
1 2 3
0 10
0 12
2
1
2

出力例

1 2 3 10 12
1 2 3 10

末尾に追加したり削除したりは、append と pop を利用すれば簡単にできる。Python は。

Python
N,Q = map(int,input().split())
A = [int(x) for x in input().split()]
for _ in range(Q):
    q = input().split()
    if q[0] == '0':
        A.append(q[1])
    elif q[0] == '1':
        A.pop()
    else:
        print(" ".join(map(str,A)))
VBA
NQ = Split(Cells(1, 1), " ")
N = Val(NQ(0))
Q = Val(NQ(1))
Dim a() As Variant
ReDim a(N - 1)
temp = Split(Cells(2, 1), " ")
For i = 0 To N - 1
    a(i) = temp(i)
Next
For i = 1 To Q
    que = Split(Cells(i + 2, 1), " ")
    If que(0) = "0" Then
        ReDim Preserve a(UBound(a) + 1)
        a(UBound(a)) = que(1)
    ElseIf que(0) = "1" Then
        ReDim Preserve a(UBound(a) - 1)
    Else
        For j = 0 To UBound(a)
            If j = UBound(a) Then
                Debug.Print a(j)
            Else
                Debug.Print a(j) & " ";
            End If
        Next
    End If
Next

最後に

Python ではスッキリ書けて良いですね。分かりやすい。VBA は、慣れている人でないと、何をやっているのか分かりづらい気がする。特に、VBA においての動的配列はめんどくさい。

以前挑戦した、配列メニューに比べると、変化球が多くて、正確な理解が求められているような気がする。やっていて面白い。

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

Python学習,Python,paiza

Posted by LeoSaki