https://school.programmers.co.kr/learn/courses/30/lessons/214288
상담원 인원 배정 문제는 주어진 시간 동안 각 멘토가 여러 명의 상담을 처리하는 방식으로, 상담원이 주어진 시간 내에 효율적으로 배치되도록 해야 합니다. 여기서 중요한 점은 각 멘토가 담당하는 상담의 시작과 종료 시간이 주어졌을 때, 최소 대기 시간을 계산하는 것입니다.
문제 분석
문제 해결을 위한 접근법
const byType = {};
for (const [start, duration, type] of reqs) {
if (!byType[type]) byType[type] = [];
byType[type].push([start, start + duration]);
}
const dfs = (idx, sum, assign) => {
if (idx === k) {
if (sum === n) simulator(assign);
return;
}
for (let cnt = 1; cnt <= n - (k - idx - 1); cnt++) {
assign[idx] = cnt;
dfs(idx + 1, sum + cnt, assign);
}
};
dfs(0, 0, Array(k).fill(0));
const simulator = (assign) => {
let totalWait = 0;
for (let i = 1; i <= k; i++) {
const mentors = Array(assign[i - 1]).fill(0); // 배정된 멘토 만큼 배열 생성
const reqList = byType[i] || [];
reqList.sort((a, b) => a[0] - b[0]); // 시작 시간 기준 정렬
for (const [start, end] of reqList) {
mentors.sort((a, b) => a - b); // 가장 빨리 끝나는 상담사 찾기
const earliest = mentors[0];
if (earliest <= start) {
mentors[0] = end;
} else {
totalWait += earliest - start;
mentors[0] = earliest + (end - start);
}
}
}
minTime = Math.min(minTime, totalWait);
}
최종 코드
function solution(k, n, reqs) {
// type별 분리
const byType = {};
for (const [start, duration, type] of reqs) {
if (!byType[type]) byType[type] = [];
byType[type].push([start, start + duration]);
}
let minTime = Infinity; // 최소 시간
const simulator = (assign) => {
let totalWait = 0;
for (let i = 1; i <= k; i++) {
const mentors = Array(assign[i - 1]).fill(0); // 배정된 멘토 만큼 배열 생성
const reqList = byType[i] || [];
reqList.sort((a, b) => a[0] - b[0]); // 시작 시간 기준 정렬
for (const [start, end] of reqList) {
mentors.sort((a, b) => a - b); // 가장 빨리 끝나는 상담사 찾기
const earliest = mentors[0];
if (earliest <= start) {
mentors[0] = end;
} else {
totalWait += earliest - start;
mentors[0] = earliest + (end - start);
}
}
}
minTime = Math.min(minTime, totalWait);
}
const dfs = (idx, sum, assign) => {
if (idx === k) {
if (sum === n) simulator(assign);
return;
}
for (let cnt = 1; cnt <= n - (k - idx - 1); cnt++) {
assign[idx] = cnt;
dfs(idx + 1, sum + cnt, assign);
}
};
dfs(0, 0, Array(k).fill(0));
return minTime
}