今回は 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(' ')); // 更新後の座席状況を出力
}
});
🧭 コードの流れ
- 標準入力から3行のデータを受け取る
- 1行目:座席数
n - 2行目:グループ人数
aと 着席開始座席番号b - 3行目:現在の座席の状態(
0=空席、1=使用中)を配列に変換 -
bからa人分の座席をチェックして、1が含まれていたら「No」(誰か座ってる) - 全員座れる場合は、
bからa人分の席を1に変更
(※末尾を超えたら先頭に戻るよう処理) - 「
Yes」と、更新後の座席状態を出力
🗒️ まとめ
- 入力処理
- `readline を使って複数行入力を受け取る基本形を理解する。
-
lines[0], lines[1], lines[2]でそれぞれの行を取得。
- 配列処理
-
.split(' ')で文字列を配列化。 -
.map(Number)で数値に変換。
-
- 条件チェック
-
.slice(start, end)で指定範囲の要素を取り出し。 -
.includes(1)で「誰か座っている席」があるか確認。
-
- インデックス操作
- 座席番号は1始まりなので、
b - 1で配列インデックスに変換。 -
i - nで末尾超過時に先頭へ戻る(円形テーブル)。
- 座席番号は1始まりなので、
- 出力処理
-
join(' ')で配列をスペース区切り文字列に戻す。
-
- 考え方のポイント
- 配列上の状態変更として処理する。
- 境界を意識したループ処理(末尾→先頭)が重要。