第64回【Python】場所取り

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

はじめに

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

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

深夜や明け方に緊急の電話がかかってきて起こされることがあります。一応、責任者ではあるため、仕方ないと諦めているのですが、寝不足がダイレクトに体調に影響するようになりました。年は取りたくないものです。

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

場所取り

開店直後に店に入るために、番号 1 〜 N の N 人が開店前に店の前にブルーシートを合計 K 枚置きました。ブルーシートの先頭は A_1 , 最後尾は A_K です。しかし、店側は先頭から F 枚のブルーシートを撤去しました。

1 〜 N 番の人々は次のルールに従って店に並びます。
・自分のブルーシートが 1 枚以上残っているとき、自分のブルーシートのうち、最も先頭に近いブルーシートの位置に並ぶ。
・自分のブルーシートが 1 枚も残っていないとき、並ぶことなく帰宅する。

全員が並び終わった後に待機列にいる人の番号を先頭から順に答えてください。


・N = 3, K = 6, F = 3, A = [3, 2, 1, 2, 3, 2] のとき
番号 1 の人のブルーシートは 1 枚も残っていないので並ぶことなく帰宅します。
番号 2 の人のブルーシートは 2 枚残っているので、最も先頭に近いブルーシートの位置に並びます。
番号 3 の人のブルーシートは 1 枚残っているので、そのブルーシートの位置に並びます。

最終的な待機列は次の通りになるので、期待する出力は

2
3

となります。

N K F
A_1
...
A_K

・1 行目では、並びの人数 N とブルーシートの合計枚数 K と先頭から撤去されるブルーシートの枚数 F が半角スペース区切りで与えられます。
・続く K 行では、ブルーシートの所有者の番号 A_i (1 ≦ i ≦ N) が先頭から順に与えられます。


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

・1 ≦ N, F ≦ 100
・N ≦ K
・1 ≦ A_i ≦ N (1 ≦ i ≦ K)


5 10 1
1
4
4
3
5
4
2
4
1
1

こんなお店嫌だなぁ。なんで中途半端にブルーシートを撤去しちゃったんだろう。ブルーシートで場所取りするのがダメなら、全部撤去しちゃえばいいのに。ブルーシートが撤去された人はおとなしく帰るんだ。ごねて喧嘩になりそうなもんだけど。

Python
N,K,F = map(int,input().split())
A = [int(input()) for _ in range(K)]
A = A[F:]
sortedA = sorted(set(A),key=A.index)
for a in sortedA:
    print(a)
VBA
NKF = Split(Cells(1, 1), " ")
N = Val(NKF(0))
K = Val(NKF(1))
F = Val(NKF(2))
Dim A() As Integer
ReDim A(K - 1)
For i = 0 To K - 1
    A(i) = Cells(i + 2, 1)
Next
For i = 0 To K - F - 1
    A(i) = A(i + F)
Next
ReDim Preserve A(K - F - 1)
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
For Each temp In A
    If Not dic.exists(temp) Then
        dic.Add temp, temp
    End If
Next
ReDim Preserve A(dic.Count - 1)
keys = dic.keys
For i = 0 To dic.Count - 1
    A(i) = keys(i)
Next
For Each v In A
    Debug.Print v
Next

最後に

ここまで学習してきたことを組み合わせればすぐに解答できる問題。実務で利用するってこういうことかなぁという気がしないでもない。応用力ってやつでしょうか。

それにしても、VBA で書くのはとても面倒だった。もっと良い方法はあるのかもしれないけど、LeoSaki(旦那)が知っている方法でベストなものを選んだつもり。

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

Python学習,Python,paiza

Posted by LeoSaki