第66回【Python】【配列に対しての複雑な処理】集団行動

現在取り組んでいるのは、paiza ラーニング問題集「配列活用メニュー」になります。

はじめに

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

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

「配列活用メニュー」のラストです。終盤は、かなり応用力が問われる問題が続き楽しかったです。少しは成長したでしょうか。と、もう終わりの雰囲気を出していますが、まだまだ続く予定です。

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

【配列に対しての複雑な処理】集団行動

あなたは集団行動のリーダーです。次のような指示を出すことで様々な列の操作ができます。

swap A B
先頭から A 番目の人と、先頭から B 番目の人の位置を入れ替える。
reverse
列の前後を入れ替える。
resize C
先頭から C 人を列に残し、それ以外の人を全員列から離れさせる。ただし、列が既に C 人以下の場合、何も行わない。

初め、列には番号 1 〜 N の N 人がおり、先頭から番号の昇順に並んでいます。(1, 2 , 3, …, N)
あなたの出した指示の回数 Q とその指示の内容 S_i (1 ≦ i ≦ Q) が順に与えられるので、全ての操作を順に行った後の列を出力してください。

N Q
S_1
...
S_Q

・1 行目では、初めの列の人数 N と、指示の回数 Q が半角スペース区切りで与えられます。
・以降の N 行では指示の内容を表す S_i (1 ≦ i ≦ N) が与えられます。


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

・1 ≦ N , Q ≦ 100
・S_i は、swap A Breverseresize C のいずれかの形式です。
・1 ≦ C ≦ N
・A, B はその時点で操作可能であるような生徒番号が与えられます。


100 5
resize 29
reverse
swap 18 24
resize 47
reverse

なかなかに横暴なリーダーが指示を出しているようです。

Python
N,Q = map(int,input().split())
students = [int(x) for x in range(1,N+1)]
for _ in range(Q):
    S = input().split()
    if S[0] == 'swap':
        a = int(S[1]) - 1
        b = int(S[2]) - 1
        students[a], students[b] = students[b], students[a]
    elif S[0] == 'resize':
        c = int(S[1])
        if len(students) > c:
            students = students[:c]
    else:
        students.reverse()
for p in students:
    print(p)
VBA
NQ = Split(Cells(1, 1), " ")
N = Val(NQ(0))
Q = Val(NQ(1))
Dim students() As Integer
ReDim students(N - 1)
For i = 0 To N - 1
    students(i) = i + 1
Next
For i = 1 To Q
    S = Split(Cells(i + 1, 1), " ")
    If S(0) = "swap" Then
        A = Val(S(1)) - 1
        B = Val(S(2)) - 1
        temp = students(A)
        students(A) = students(B)
        students(B) = temp
    ElseIf S(0) = "resize" Then
        C = Val(S(1))
        If UBound(students) > C Then
            ReDim Preserve students(C - 1)
        End If
    Else
        Dim arrTemp() As Integer
        ReDim arrTemp(UBound(students))
        k = 0
        For j = UBound(students) To LBound(students) Step -1
            arrTemp(j) = students(k)
            k = k + 1
        Next
        students = arrTemp
    End If
Next
For Each p In students
    Debug.Print p
Next

最後に

Python では簡単に書くことができたけれど、VBA で書ききれたことに喜びもひとしお。普段だったら、さっさとワークシートに逃げていた気がします。勉強になったと思う。

これにて、「配列活用メニュー」は終了です。次からは、「条件分岐メニュー」に挑戦してみようと思っています。正直、素通りできるくらい簡単な問題でも、じっくり 1 問ずつ取り組んでいると、いろいろな気づきがあります。だからまだ辞めない。頑張る。

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

Python学習,Python,paiza

Posted by LeoSaki