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

未分類

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)

コメント

タイトルとURLをコピーしました