알고리즘 디스크 컨트롤러 javascript

HyosikPark·2021년 1월 22일
0

알고리즘

목록 보기
65/72
function solution(jobs) {
  // 먼저 요청 시간순으로 오름차순 정리한다.
    jobs.sort((a,b) => a[0] - b[0]);
  // 작업들을 빼내기 전에 미리 총 작업 수를 구한다.
    const jobsNum = jobs.length;
  // 작업이 진행되는 동안 요청으로 들어온 작업들을 
  // 대기시키기 위한 queue
    let queue = [];
  // 각 작업이 종료된 시간
    let end = 0;
  // 각 작업의 요청부터 종료까지의 총합
    let sum = 0;
    
  // 모든 작업들을 queue에 올리고 queue에서 모든 작업이
  // 종료되면 반복문 종료. 
  // 어떠한 작업이 종료되고 난 후에 요청이 들어오면
  // queue가 비어있기 때문에 jobs길이 까지 고려.
    while(queue.length || jobs.length) {
        
      // jobs를 요청 시간순으로 정렬해뒀기 떄문에
      // 진행중인 작업의 종료시간 전에 들어온 모든
      // 요청을 queue에 적재.
        while(jobs[0] && jobs[0][0] <= end) {
            queue.push(jobs.shift());
        }
      // 작업 요청이 늦어 queue가 비어있을 경우
      // 시간만 증가.
        if(!queue.length) {
            end++;
            continue;
        }
      // queue에 있는 모든 작업들을 작업시간 기준
      // 오름차순 정렬
        queue.sort((a,b) => a[1] - b[1]);
      
      // 작업이 종료된 후 quque에서 제거
        const [from,to] = queue.shift();
      // 종료시간 업데이트
        end += to;
      // 요청~완료 시간 누적
        sum += end-from;
        
    }
    // 평균시간 정수로 반환.
    return parseInt(sum / jobsNum);
}

힌트

어떠한 작업이 시작부터 끝나는 순간까지 요청으로 들어온 모든 작업들 중 처리시간이 가장 짧은 작업을 다음 작업으로 처리해야 평균을 가장 줄일 수 있다.

0개의 댓글