第62回【Python】queue (9) 係

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

はじめに

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

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

朝起きると、ルナちゃんが必ず横で寝ています。布団に潜るのが下手な子で、開けてやらないと入れなかったのに、いつの間にか自分で入れるようになったみたいです。いや、LeoSaki(旦那)の寝相が悪くて開いた隙間から布団に潜りこんでいるのかもしれない。

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

queue (9) 係

データ構造の queue と同様の働きをするロボットがあります。ロボットは指示に応じて配列 A に対して 2 種類の仕事を行います、仕事の内容は以下の通りです。

in n と指示された場合、A の末尾に n を追加してください。
out と指示された場合、A の先頭の要素を削除してください。ただし、A が既に空の場合、何も行わないでください。

ロボットに与えられる指示の回数 N と、各指示の内容 S_i が与えられるので、ロボットが全ての処理を順に行った後の A の各要素を出力してください。
なお、初め配列 A は空であるものとします。

N
S_1
...
S_N

・1 行目では、ロボットに与えられる指示の回数 N が与えられます。
・続く N 行では、先頭から順に指示が与えられます。
・S_i は in n (n は整数) または out です。


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

・1 ≦ N ≦ 100
・-100 ≦ n ≦ 100 (1 ≦ i ≦ N)


10
out
in 33
out
out
out
out
in -76
out
out
in -53

queue は FIFO ですね。First In First Out の略で、日本語だと「先入れ先出し」って言われます。仕入れたものから順番に仕入れた通りに売っていくイメージでしょうか。

Python
N = int(input())
A = []
for _ in range(N):
    s = input().split()
    if s[0] == 'in':
        A.append(int(s[1]))
    elif s[0] == 'out' and len(A) > 0:
        A.pop(0)
for a in A:
    print(a)

queue なので、queue モジュールを利用してみる。

Python
import queue
N = int(input())
q = queue.Queue()
for _ in range(N):
    s = input().split()
    if s[0] == 'in':
        q.put(int(s[1]))
    elif s[0] == 'out' and q.qsize() > 0:
        q.get()
while not q.empty():
    print(q.get())
VBA
N = Cells(1, 1)
Dim A() As Integer
For i = 0 To N - 1
    If Cells(i + 2, 1) = "out" Then
        If (Not A) <> -1 Then
            If LBound(A) = UBound(A) Then
                Erase A()
            Else
                For j = LBound(A) To UBound(A) - 1
                    A(j) = A(j + 1)
                Next
                ReDim Preserve A(UBound(A) - 1)
            End If
        End If
    Else
        S = Split(Cells(i + 2, 1), " ")
        If (Not A) = -1 Then
            ReDim A(0)
        Else
            ReDim Preserve A(UBound(A) + 1)
        End If
        If LBound(A) = UBound(A) Then
            A(0) = Val(S(1))
        Else
            A(UBound(A)) = Val(S(1))
        End If
    End If
Next
For Each v In A
    Debug.Print v
Next

VBA での配列操作は苦手だ・・・。ワークシートを使うという手もあるけれど、一応、コード内のみでなんとか処理をしてみた。

最後に

Python はすぐに書くことができたのだけれど、VBA は思いのほか時間がかかってしまった。そして、これが正解だとは思えない・・・。

今回、いろいろと調べてみて、VBA で queue を実装するためにクラスモジュールを作成されている記事を多く見た。工夫が必要なんだなぁ。部品を用意しておけば、後々何かで使えるかもしれないけれど、どうだろう。あまりこれを使う場面がイメージできない。それはまだまだ経験値が足りないからだろうか。

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

Python学習,Python,paiza

Posted by LeoSaki