見てくださりありがとうございます!!
以下、paizaの練習問題を掲載しています。
paizaの本番のスキルチェックの問題文の掲載は規約違反ですが、
paizaの練習問題は掲載しても構わないとのことですので質問させていただきます。
現在勉強のためpaizaのスキルチェック問題を解いています。
paizaの練習問題で、自分ではどうしてもわからない問題があります。
以下問題文
東京の下町に長テーブルで有名な老舗うなぎ屋がありました。
そのうなぎ屋にはとても大きい長テーブルがあり、テーブルの周りに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行で出力してください。
長テーブルのうなぎ屋 (paizaランク B 相当) より抜粋
自分が考えたコードは以下です
Ruby
1n,m = gets.split.map(&:to_i) 2 3chairs = [*1..n] 4 5m.times do 6 a,b = gets.split.map(&:to_i) 7 if n < b + a - 1 8 guest = [*b..n,*1..(a + b - n - 1)] 9 else 10 guest = [*b..(b + a - 1)] 11 end 12 chairs -= guest if (chairs - guest).size < chairs.size 13end 14 15puts n - chairs.size 16
n座席
mグループ数
a 座る人数
b 座り始める座席
自分の思考の順序としては、
- 数値取得
- 空いている座席を設定
- ゲストがどの座席に座るかを特定
--座席のループの有無確認 例)座席数10席で、8番目の席から5人座りたいパターン
-ループしない場合
b番目からn番目と、1番目から(溢れた人数)番目までの座席
-ループする場合
b番目からa+b-1番目までの座席
- 特定した座席が座れるか特定
-座れなければ、空席配列はそのまま
-座れれば、空いている座席の配列から特定した座席の配列を引く
5.以上をグループ数だけループ
6.埋まった数を出力
のように考えました。
考えたコードは以下で試しました。
paiza io
入力例1
6 3
3 2
1 6
2 5出力例1
4入力例2
12 6
4 6
4 8
4 10
4 12
4 2
4 4出力例2
12
入力例としては以上がありますが、自分の答案では正解できませんでした。
間違いに気づかれた方、何かヒントを出してくださる方、ご教授よろしくお願いします。
最後まで読んでくださりありがとうございます。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/29 09:03