PaizaラーニングでPythonを学び始めたので、とりあえず、スキルチェックをうける。
ランクD(数字の掛け算)からあるので、気軽に始められる。
さて今回、ランク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)
コメント