Love澤's Room

技術系ネタをまとめていたブログ。カテゴリにこだわらず更新していこうかと思います。

Paiza 長テーブルのうなぎ屋 (paizaランク B 相当)を解く

https://paiza.jp/images/for_teams/lps/box-image1.png

PaizaラーニングでPythonを学び始めたので、とりあえず、スキルチェックをうける。
ランクD(数字の掛け算)からあるので、気軽に始められる。

さて今回、ランクB(相当)問題のうなぎ屋さんの問題を説いたので忘れないうちにメモ。
もし誰かの役に立てばもっと良いなぁ。

目次

問題

長テーブルのうなぎ屋 (paizaランク B 相当)

ちょっと面白かったので一部抜粋して引用

東京の下町に長テーブルで有名な老舗うなぎ屋がありました。

そのうなぎ屋にはとても大きい長テーブルがあり、テーブルの周りにn個の座席が配置されています。
(中略)
今、m個のグループの人達が座席に順番に座りに来ます。
(中略)
彼らは、長テーブルに並んだ座席の内、ある連続するa_i個の座席に一斉に座ろうとします。

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

気が早いんでぃ。

解答・解説

もっと効率良いやり方はあると思うんだけど、直感的にわかりやすかったやり方で。解説はコメント多めで代用。

# coding: utf-8

# 1行目を受け取る
nm_line = input().rstrip().split(" ")

# 座席数nとグループ数mに分ける
n = int(nm_line[0])
m = int(nm_line[1])

# 空席の座席リストを作成(空いている場合「半角スペース」、座っている場合「*」)
# ここでは、座ったことを示すマークとして、ここでは「*」を設定する
# 別に、True/Falseを設定していっても全然問題ない。
# 個人的に、print(zaseki)としたときに、
# どこに座っているかが視覚的にわかりやすいのでこのようにする。
zaseki = [" "] * n

# グループ数分だけ入力を受ける
for i in range(m):
    # 座る人数a, 座席の位置b
    ab_line = input().rstrip().split(" ")
    a = int(ab_line[0])
    b = int(ab_line[1])

    # 座っているかどうかを示すフラグsit_flg(空いている場合:True、先客がいる場合:False)
    sit_flg = True

    # 全員座れるか確認
    for j in range(a):
        # 座ろうとする位置 address
        #   指定された座席の位置b
        #   指定された位置からのズレ具合j
        #     1人目の場合、指定された位置bの席に座ろうとする
        #       address = b
        #     2人目の場合、指定された位置bの隣の席(b+1)に座ろうとする
        #       address = b + 1
        #   という考え。
        address = b + j
        # 座ろうとする位置addressが最後の座席以上の数値を示した場合は、
        # また最初の席以降を指すようにアドレスを更新する
        while address >= n:
            address -= n

        # 座ろうとする位置addressの席に、先客がいるかどうかを確認
        # 先客がいる場合はsit_flg=False(先客がいる)とする
        if zaseki[address] != " ":
            sit_flg = False

    # sit_flg=Trueなら全席空いていたみなせる
    # sit_flg=Falseならどこかの席に先客がいた
    if sit_flg:
        # あいていれば着席する
        for j in range(a):
            # 座ろうとする位置 address
            # 考え方は座れるか確認したときと同じ
            address = j + b
            while address >= n:
                address -= n

            # 座っていることを示すマーク「*」を設定
            zaseki[address] = "*"
            # ここでprintすると、1名ずつ座っていく様子がわかる
            # print(zaseki)
            
    # ここでprintすると、1組ずつ座っていく様子がわかる
    # print(zaseki)

# 着席している人数をカウント
count = 0
for i in zaseki:
    if i == "*":
        count += 1

print(count)