0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「長テーブルのうなぎ屋」を解くために:part6

Last updated at Posted at 2025-11-14

今回は paiza の「「長テーブルのうなぎ屋」を解くために:part6」の問題に挑戦!


🧩 問題概要

この問題では、円形のテーブル状に並んだ座席に、グループが着席できるかを判定する。

  • 与えられる入力
    • 座席の総数 n
    • グループの人数 a と、着席を開始する座席番号 b
    • 現在の座席の状態を表す n 個の整数(0=空席、1=使用中)

  • 判定ルール
    • グループ a 人全員が、連続して b 番目の席から座れるか確認する
    • テーブルは円形なので、末尾の席を超えた場合は先頭に戻る(折り返し)

  • 出力内容
    • 座れない場合 → No
    • 座れる場合 ↓
Yes
(着席後の座席の状態)

  • 目的
    • 条件に応じて「Yes/No」を出力し、
    • 必要に応じて配列(座席状態)を更新して出力すること。



入力例:

6
2 3
1 0 0 0 1 0

出力例:

Yes
1 0 1 1 1 0








✅ OK例:

const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];

// 入力を1行ずつ読み込む
rl.on('line', (input) => lines.push(input));

rl.on('close', () => {
    const n = Number(lines[0]); // 座席数
    const [a, b] = lines[1].split(' ').map(Number); // グループ人数a、開始座席番号b
    const seats = lines[2].split(' ').map(Number); // 座席の状態(0=空席, 1=使用中)

    // b番目からa人分の席に、すでに誰か座っているか確認
    if (seats.slice(b - 1, a + b - 1).includes(1)) {
        console.log('No'); // 座れない
    } else {
        // 全員座れる場合 → 座席を1に更新
        for (let i = b - 1; i < a + b - 1; i++) {
            if (i < n) {
                seats[i] = 1; // 通常範囲内ならそのまま
            } else {
                seats[i - n] = 1; // テーブル末尾を超えたら先頭に戻る
            }
        }
        console.log('Yes'); // 座れた
        console.log(seats.join(' ')); // 更新後の座席状況を出力
    }
});

🧭 コードの流れ

  1. 標準入力から3行のデータを受け取る
  2. 1行目:座席数 n
  3. 2行目:グループ人数 a と 着席開始座席番号 b
  4. 3行目:現在の座席の状態(0=空席、1=使用中)を配列に変換
  5. b から a 人分の座席をチェックして、1が含まれていたら「No」(誰か座ってる)
  6. 全員座れる場合は、b から a 人分の席を 1 に変更
    (※末尾を超えたら先頭に戻るよう処理)
  7. Yes」と、更新後の座席状態を出力






🗒️ まとめ

  • 入力処理
    • `readline を使って複数行入力を受け取る基本形を理解する。
    • lines[0], lines[1], lines[2] でそれぞれの行を取得。

  • 配列処理
    • .split(' ') で文字列を配列化。
    • .map(Number) で数値に変換。

  • 条件チェック
    • .slice(start, end) で指定範囲の要素を取り出し。
    • .includes(1) で「誰か座っている席」があるか確認。

  • インデックス操作
    • 座席番号は1始まりなので、b - 1 で配列インデックスに変換。
    • i - n で末尾超過時に先頭へ戻る(円形テーブル)。

  • 出力処理
    • join(' ') で配列をスペース区切り文字列に戻す。

  • 考え方のポイント
    • 配列上の状態変更として処理する。
    • 境界を意識したループ処理(末尾→先頭)が重要。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?