Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

posted at

updated at

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

長テーブルのうなぎ屋

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?