#長テーブルのうなぎ屋
paizaラーニングのスキルチェック見本問題セットについて、、、
この問題はなんとか正解することはできたが、絶対にもっと効率の良い書き方がある、、、と思い、解説を見てみた。
すると、簡潔なわかりやすいコードが、、、↓↓↓
#ポイント
・空席状況を管理する変数 (配列がいい) を用意し、すべて空席としてマークしておく。
・グループが来店する度に、そのグループが座れるかどうかを判定。
座れるなら、座った座席を使用済みとしてマークする。座れないなら、何もしない。
・座席 n と座席 1 が隣り合っていることに注意。
これをプログラム上で表現するには、n で割った剰余を用いる!
⏩ここがわからなかった。。。
#実装例
process.stdin.resume();
process.stdin.setEncoding('utf8');
// 自分の得意な言語で
// Let's チャレンジ!!
var lines = [];
var reader = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
reader.on('line', (line) => {
lines.push(line);
});
reader.on('close', () => {
// ファイルを読み込む
const fs = require("fs");
// inputに入力値を入れる
const input = fs.readFileSync("/dev/stdin", "utf-8");
// linesを配列にする(\nは、改行で区切るという意味)
const lines = input.split("\n");
// linesの要素それぞれを配列に分割する(n=座席数,m=グループ数)
const [n, m] = lines[0].split(" ").map((num) => Number(num));
// n個の要素を持った配列seatsを作る
const seats = Array(n);
// n個の要素を持った配列(中身は空)seatsの中身をすべて0にする
// seats[?]が0なら空席、1なら座れない
seats.fill(0);
let count = 0;
for (let i = 1; i <= m; i++) {
// a=グループの人数,b=着席開始座席番号
// lines[1](1グループ目)から順に、2個の要素を持った配列を作り、文字列を数値に変換して、aにその[0]を入れる
const a = lines[i].split(" ").map((num) => Number(num))[0];
// bもaと同様
let b = lines[i].split(" ").map((num) => Number(num))[1];
b -= 1;
// flag=trueなら、座れる
let flag = true;
// 座席が埋まっているか確認
for (let j = 0; j < a; j++) {
// seats[?]が0なら空席、1なら座れない
// 座席 n と座席 1 が隣り合っていることに注意しましょう。これをプログラム上で表現するには、n で割った剰余を用いる
if (seats[(j + b) % n] !== 0) {
// flag=falseなので座れない
flag = false;
}
}
// flag=trueなら、座れる
if (flag) {
// 席を埋める
// 座席 n と座席 1 が隣り合っていることに注意しましょう。これをプログラム上で表現するには、n で割った剰余を用いる
for (let j = 0; j < a; j++) {
// seats[?]が0なら空席、1なら座れない
seats[(j + b) % n] = 1;
}
// 無事に座席に着席出来ている人数をカウントする
count += a;
}
}
console.log(count);
});
座席の状態を管理する配列 seats を用意し、グループが来店する度にシミュレートして、そのグループが座れるかどうかを確かめている。