[프로그래머스] 디스크 컨트롤러

adultlee·2023년 6월 12일
0

프로그래머스 3단계

목록 보기
16/39
post-custom-banner

문제 링크

프로그래머스 문제

풀이

Queue라기 보다는 배열을 효과적으로 사용해야만 풀 수 있는 문제 이다.

주의해야할 점들을 먼저 모두 작성해보았다.

  1. 0초에 시작인 여러가지 시간이 동시에 들어오는 경우, 가장 시간이 짧은 값이 들어와야 한다.
  2. 그렇다면 현재 진행중인 작업의 종료시간 전에 들어오는 작업들 중에서 가장 시간이 짧은것을 사용할 수 있으면 된다.
  3. 현재 작업이 마무리 되는 시간보다도 한참 나중에 들어오는 업무에 대해서는 0초에 시작되는것과 같이 time을 이동시켜 해결한다.

코드

const solution = (jobs) => {
  let answer = 0;
  jobs.sort((a, b) => a[0] - b[0]); // 시작 시점을 기준으로 정렬한다

  let i =0; // index
  let time = 0; // 현재까지 수행하고 시작해야 하는 시간
  const Queue = []; // 다음 들어갈 업무를 담습니다.
// 순회를 하면서 추가 합니다. 그리고 Queue가 다 비워질 때까지 기다립니다.
  while (i < jobs.length || Queue.length !== 0) {
    if ( i<jobs.length  && jobs[i][0] <=time) {  
// 첫시행에서 바로 추가가됩니다. 현재 시간이 0이기 떄문
// 근데 첫 시작이 0이 아니면 바로 아래로 내려감
      Queue.push(jobs[i]);
      i++;
   
      Queue.sort((a, b) =>  a[1] - b[1]); // 시간이 적은 순서로 정렬시킵니다. 가장 작은 값 
    }
    else if (Queue.length !== 0) { // queue에 값이 있다면,
      const [curStartTime , curTime] = Queue.shift();
      time += curTime; // 소요시간만큼 추가합니다.
      answer += time - curStartTime // 이때, 최종적으로 이동하게 된 시간 만큼 이동한다. 
      
    } else {  // queue에 아무값도 없으며, time이 현제 시점의 jobs보다 빠른경우 -> 이 경우에는 바로 시작해야 한다. 

      time = jobs[i][0];
    }
  }

  return parseInt(answer / jobs.length);
};
post-custom-banner

0개의 댓글