プログラミングBlog

長テーブルのうなぎ屋 JavaScript編

PaizaのBランク問題に挑戦。
簡単に解ける言ってる人多いですが、普通に難しかったです。

レベルアップ問題集

なお、このコーナー内の問題については、ユーザー同士で解答を教え合ったり、コードを公開したりするのは自由としています。 授業や研修にもご利用いただけますので、ぜひ教材などにもお使いください。

コーディングスキルチェック受験での禁止行為

入力される値

  • 座席数
  • グループ数
  • グループの人数
  • 着席開始座席番号

期待結果

  • 最後のグループが座りに来た後、無事に座席に着席出来ている人数を1行で出力してください。

処理の流れ

  • グループ数分、座席に座る処理
  • 座席が埋まっていた場合の処理
  • 最大座席数を超えた場合に一番目から座る処理

考え方

先にグループの人数と着席開始座席番号を格納した2つの配列を作ります。
次にグループの数だけ繰り返し処理を行う。
このときにまずは以下の要件を満たすように先客がいた場合は帰宅する処理を書きます。   

ただしお客さんは江戸っ子なので、それら座席のうち、いずれか一つでも既に先客に座られている座席があった場合、 一人も座らずにグループ全員で怒って帰ってしまいます。江戸っ子は気が早いんでぃ。

もし、先客がいなかった場合は着席開始座席番号から順に座席に座ってもらいます。
最大座席数を超えた場合に一番目から座る処理も忘れずに。
最後に座席に残った人数を表示させて処理終了。

// 標準入力
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});

reader.on('line', (line) => {
    var nums = line.split(" ")
    for (var i = 0; i < nums.length; i++) {
        lines.push(parseInt(nums[i]));
    }
});

reader.on('close', () => {
    // 座席
    var seats = new Array(lines[0]).fill(0);

    // 人数と開始番号
    var NumberOfPeopleAndStartNumber = lines.splice(2, lines[1] * 2);

    // 人数
    var peoples = NumberOfPeopleAndStartNumber.filter(function (value, index) {
        if (index % 2 === 0) {
            return value;
        }
    });

    // 開始番号
    var startNumbers = NumberOfPeopleAndStartNumber.filter(function (value, index) {
        if (index % 2 === 1) {
            return value;
        }
    }).map((a) => a - 1);

    // グループ数分座席に座る処理
    for (var i = 0; i < NumberOfPeopleAndStartNumber.length / 2; i++) {
        var sitting = false;
        // 座席の確認
        for (var x = 0; x < peoples[i]; x++) {
            if (seats[startNumbers[i]] + x > seats.length) {
                if (seats[0] === 1) {
                    sitting = true;
                    break;
                }
            } else {
                if (seats[startNumbers[i] + x] === 1) {
                    sitting = true;
                    break;
                }
            }
        }

        // 座先確定
        if (!sitting) {
            for (var y = 0; y < peoples[i]; y++) {
                if (seats[startNumbers[i]] + y > seats.length) {
                    seats[0] = 1;
                } else {
                    seats[startNumbers[i] + y] = 1;
                }
            }
        }
    }
    // 座席に座っている人数
    console.log(seats.reduce((sum, num) => sum + num, 0));
});