アルゴリズム問題 paiza練習問題 長テーブルのうなぎ屋

最近、コードを書くことからめっきり離れていたので、久しぶりに書いてみようかと。

※こちらの問題はpaizaさんにて公開されているBランクの練習問題の自分なりのまとめ、備忘録です。
 スキルチェックの公式問題の流出を目的、意図したものではありません。

問題

うなぎ屋にはとても大きい長テーブルがあり、テーブルの周りにn個の座席が配置されています。
座席には、時計回りに1, 2, …, nと番号が振られています。
座席はテーブルの周りに配置されているので、座席番号nの座席と1の座席は隣接しています。

今、m個のグループの人達が座席に順番に座りに来ます。i番目(1≦i≦m)のグループの人数をa_i人とします。
彼らは、長テーブルに並んだ座席の内、ある連続するa_i個の座席に一斉に座ろうとします。

ただしお客さんは江戸っ子なので、それら座席のうち、いずれか一つでも既に先客に座られている座席があった場合、
一人も座らずにグループ全員で怒って帰ってしまいます。江戸っ子は気が早いんでぃ。

入力では、i番目のグループが座ろうとする連続した座席の位置は、整数b_iにより指定されます。
i番目のグループは、座席番号b_iの座席を始点として、そこから時計回りにa_i個分の座席に座ろうとします。

最後のグループが座りに来た後、無事に長テーブルの座席に着席出来ている人数を出力するプログラムを作成してください。

入力

入力はm+1行から成ります。
1行目にはn(座席数)とm(グループ数)が半角スペース区切りで入力されます。
i+1行目(1≦i≦m)には2個の整数a_i(グループの人数)とb_i(着席開始座席番号)が半角スペース区切りで入力されます。

出力

最後のグループが座りに来た後、無事に座席に着席出来ている人数を1行で出力してください。

提出コード

# Let's チャレンジ!!
import copy
# シート数とグループ数を定義
seets,groups = [int(x) for x in input().split()]

# 座席を表す配列を用意
filledSheets = []
fixedSheets = []

# groupの数だけ回す
for i in range(groups):
    # とりあえず入力を取得
    members,requestSheet = [int(x) for x in input().split()]

    flg_away = False

    for j in range(members):
        
        # 要求シートが埋まっていなければ、とりあえず埋める
        if requestSheet not in filledSheets:
            filledSheets.append(requestSheet)
            requestSheet += 1
            
            # 要求シートの番号が店の席番号を超えたら、「1」を用意
            if requestSheet > seets:
                requestSheet = 1
        # 要求シートが埋まっていたら、グループは帰る
        else:
            flg_away = True
            break
            
    # グループが帰ったのなら、シートの状態を戻す
    if flg_away:
        filledSheets = fixedSheets.copy()
    # グループのメンバーが全員座ったなら、埋まったものとして固定
    else:
        fixedSheets = filledSheets.copy()

print(len(fixedSheets))

感想

いや、時間かかりすぎ、コード汚すぎ。
こんな配列ゴリゴリ入れ替える方法ではなく、もっとスマートな方法あると思うんだが、ぱっと思いつかないんだよな。。。

フラグを使って、ループの処理をごにょごにょしてるのも、もっといい方法あると思うのだが、思いつかなんだ。

やっぱり、日常的にコード書く癖をつかないとまずいなぁ。