선입 선출 스케줄링
Lv. 3
Solution
function available(cores: number[], totalTime: number): number {
return cores.reduce((prev, curr) => prev + Math.floor(totalTime / curr), 0);
}
function lowerBound(remain: number, cores: number[]): number {
let [left, right] = [0, Math.min(...cores) * remain];
while (left < right) {
const mid = Math.floor((left + right) / 2);
if (remain <= available(cores, mid)) {
right = mid;
} else {
left = mid + 1;
}
}
return right;
}
export function solution(n: number, cores: number[]) {
if (n <= cores.length) {
return n;
}
const remain = n - cores.length;
const totalTime = lowerBound(remain, cores);
let numberOfOrder =
remain - cores.reduce((prev, curr) => prev + Math.floor((totalTime - 1) / curr), 0);
let answer = 0;
while (0 < numberOfOrder) {
if (totalTime % cores[answer] === 0) {
numberOfOrder -= 1;
}
answer += 1;
}
return answer;
}