1
0

More than 3 years have passed since last update.

(paiza スキルチェック見本問題)「長テーブルのうなぎ屋 JavaScript編」

Last updated at Posted at 2021-05-19

長テーブルのうなぎ屋

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 を用意し、グループが来店する度にシミュレートして、そのグループが座れるかどうかを確かめている。

1
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
1
0