概要
こちらの問題をJavaScriptで解きました。
方針
最後に座る人が席数をオーバーするとき・しないときの場合分けをなるべくすっきり書きたい
- 空席確認と座席の更新は配列のループではなく
slice
とfill
メソッドを使って一度に処理する - オーバーする場合は ①座り始め~席数 ②最初の席~座り終わり の2つの処理が必要
- オーバーしない場合は座り終わりの席番号
end
を0にして(slice(0,0)
)、毎回①②両方の処理を通すことにする
回答
// 標準入力からの値取得省略
const [n, m] = lines[0].split(' ').map((num) => Number(num));
let cnt = 0;
// 座席を生成
const seats = new Array(n);
seats.fill(0);
for (let i=1; i<=m; i++){
const [people, no] = lines[i].split(' ').map((num) => Number(num));
let start = no - 1;
let max = no + people - 1 <= n ? no + people - 1 : n; // 最大の席番号
let end = no + people - 1 <= n ? 0 : no + people - 1 - n; // 座り終わりの席番号
// 空席確認
if (seats.slice(start, max).includes(1)) continue; // 座り始めから最大の席番号まで
if (seats.slice(0, end).includes(1)) continue; // 最初の席番号から座り終わりまで
// 全て通過した場合座席を更新
seats.fill(1, start, max);
seats.fill(1, 0, end);
}
for (let i=0; i<n; i++){
if (seats[i] == 1) cnt += 1;
}
console.log(cnt);