今回は paiza の「エスカレーター」の問題に挑戦!
問題概要
- paizaビルのエスカレーターは
- 長さ
Kメートル - 1秒で1メートル進む
- 長さ
- 社員は
N人 - 社員
iは 時刻A_iに乗る
求めるもの
- 各社員が 乗った直後の人数
- 1人ごとに改行して出力
入力例:
4 3
1 3 4 6
出力例:
1
2
2
2
✅OK例:
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];
rl.on('line', line => lines.push(line));
rl.on('close', () => {
const [N, K] = lines[0].split(' ').map(Number);
const A = lines[1].split(' ').map(Number);
const queue = []; // エスカレーター(キュー)
let idx = 0; // 次に乗る社員のインデックス
let current = 0; // 現在エスカレーター上の人数
const maxTime = A[N - 1]; // 最後に誰かが乗る時刻までシミュレート
for (let t = 1; t <= maxTime; t++) {
// K秒経過した人を降ろす
if (queue.length === K) {
const left = queue.shift();
if (left === 1) {
current--; // 1なら社員が降りた
}
}
// この時刻に社員が乗るか?
if (idx < N && t === A[idx]) {
queue.push(1);
current++;
console.log(current);
idx++;
} else {
queue.push(0);
}
}
});
🔍コードの流れ
- 時刻
tを 1 から順に進める - キューが
K個あれば先頭を削除(K秒経過) - その値が
1なら人数を減らす - その時刻に社員が来たら
-
1をpush - 人数を増やす
- 出力
-
- 来なければ
0をpush
📝まとめ
エスカレーターに乗る人と降りる人を、キューの先入れ先出し(FIFO: First In, First Out)で表現。