yukicoder No.893 お客様を誘導せよ
この問題は別に書かなくてもいいかなと思ったけど,みんなそう思ったのか解説記事が少なそうなので一応書くことにした。
問題
やり方はすぐわかると思われる。
上図のようにレジ(塗りつぶしがレジ,白の四角が人)に人が並んでいるとすると出力すべき答えは
である。
実装のポイントは以下の2点。
入力の受け取り
レジに並んでいる人数の把握 入力の受け取りはこうした
N = int(input()) P = [0 for _ in range(N)] A = [[] for _ in range(N)] for i in range(N): P[i],*A[i] = map(int,input().split())
これでP,Aは以下のようになる
#入力 #3 #3 1 2 3 #2 4 5 #1 6 #出力 #P:[3, 0, 1, 2, 0] #A:[[1, 2, 3], [], [4], [5, 6], []]
あとはAに格納されている要素を前から順に出力する。このときにindexを指定してもよいがpopを利用すると楽である。
5. データ構造 — Python 3.8.1 ドキュメント
ざっくりいうと,指定したindexの要素を取り出して,削除する。
list.pop(0)とすれば先頭の要素を取り出して,その要素を削除するので,pop(0)を繰り返せば常に先頭の要素が取り出せる。
さらにそのときに,P[i]の値を1ずつデクリメントしておけば,out of indexのエラーがでることも防げる。
N = int(input()) P = [0 for _ in range(N)] A = [[] for _ in range(N)] cnt = 0 for i in range(N): P[i],*A[i] = map(int,input().split()) cnt += P[i] i,j = 0,0 while 1: if P[i%N] > 0: print(A[i%N].pop(0), end=" ") j += 1 P[i%N] -=1 if j == cnt: exit() i += 1