[프로그래머스 힙 Lv.3 디스크 컨트롤러] 저의 코드와 정답 코드의 비교...

[프로그래머스 힙 Lv.3 디스크 컨트롤러] 저의 코드와 정답 코드의 비교...

작성일 2023.04.06댓글 1건
    게시물 수정 , 삭제는 로그인 필요

상단 코드는 저의 코드이고 하단 코드는 정답 코드입니다.
저의 처음 생각은 힙을 사용하지 말고 진행하는 것이었습니다. 굳이 필요없을 것 같더라구요. (저의 짐작...)
다음으로 시간 오름차순으로 jobs를 오름차순 정렬한 후 맨 처음 job을 처리하고 나서,
그 사이에 요청된 다른 job들이 있으면 그것들 중 최소의 소요시간(min)을 갖는 job을 선택하도록 했습니다.
또한 대기 시간이 0보다 작으면 현재시간(current)만 갱신하고, 0보다 크다면 대기시간을 더한 소요시간을 다시 push하여
최종적으로 대기시간까지 포함한 소요시간을 평균 내었습니다.

전체적인 흐름은 정답의 흐름과 비슷한 거 같은데 어떤 부분에서 미처 생각치 못한 부분이 있는지 고수님들의 고견 부탁드립니다.

P.S. 하단 정답 코드의 MinPriorityQueue는 직접 구현한 클래스입니다.

==============================================================
function solution(jobs) {
  // 문제에 시간 오름차순 정렬된 채로 주어진다는 언급 없음
  jobs = jobs.sort((a,b) => a[0]-b[0]);
  // 초기 상태에서는 작업을 수행하지 않으므로 바로 시작
  let progress = [];
  let current = jobs[0][1];
  progress.push(jobs.shift());
  while(jobs.length > 0) {
    // 소요 시간이 가장 짧은 작업 선택
    let j = 0, min = jobs[j][1];
    for(let i = 1; i < jobs.length; i++) {
      if(jobs[i][0] <= current) {
        if(min > jobs[i][1]) {
          j = i;
          min = jobs[j][1];
        }
      }
      else break;
    }

    let on_process = jobs.splice(j, 1)[0]; // 요청 시간

    let delay = current - on_process[0]; // 대기 시간
    if(delay > 0) {
      current += on_process[1];
      on_process.push(delay + on_process.pop()); // 종료 시간
    } else {
      current += on_process[1] - delay;
    }

    progress.push(on_process);
  }
  //console.log(progress)
  let sum = progress.reduce((acc, curr) => acc + curr[1], 0);
  return ~~(sum / progress.length);
}
==============================================================
function solution(jobs) {
  jobs.sort((a,b) => a[0]-b[0]);
  let pqueue = new MinPriorityQueue();
  let count = 0;
  let index = 0;
  let end = 0;
  let total = 0;

  while(count < jobs.length) {
    while(index < jobs.length && jobs[index][0] <= end) {
      pqueue.enqueue(jobs[index][0], jobs[index][1]);
      index++;
    }
    pqueue.heap.sort((a,b) => a[1]-b[1]);

    if(pqueue.isEmpty()) {
      end = jobs[index][0];
    } else {
      let curr = pqueue.dequeue();
      total += curr[1] + end - curr[0];
      end += curr[1];
      count++;
    }
  }
  return ~~(total/jobs.length);
}


#프로그래머스 힙

profile_image 익명 작성일 -

맨 아래 코드는 프로그래머스의 디스크 컨트롤러 문제의 해결책 중 하나입니다. 이 코드는 최소 우선 순위 큐(MinPriorityQueue)를 사용하여 작업을 처리합니다. 작업이 요청되면 우선 순위 큐에 추가되고, 작업이 완료될 때마다 우선 순위 큐에서 가장 짧은 작업을 선택하여 처리합니다.

반면에 첫 번째 코드에서는 우선 순위 큐를 사용하지 않고 직접 작업을 선택하는 방식으로 구현되어 있습니다. 이 방식은 작업을 선택하는 데 더 많은 시간이 걸릴 수 있습니다.

두 코드 모두 작업을 처리하는 방식이 다르지만, 두 코드 모두 정답으로 인정됩니다.

컴퓨터에 관함 문제에욜;; 잘몰라서...

... (1)해밍코드 (2)CRC코드 (3)패리티비트 (4)BCD코드 7.... 정답 4번 (1)하드디스크 (2)CD-ROM (3)WORM (4)자기테이프... 1,3,5,7 자리값 비교해 보면 1의 개수가 2개 입니다....

xbox360 / ps3 성능비교

... 비교하자면 어느게 더 이득이죠? 2. FPS 게임을 할거면 xbox360 가 절데적으로 더 좋다고하는데 사실인가요? 3.... 프로그래밍 코드들도 다릅니다. 그리고 게임 디스크...

플레이스테이션3 80기가

... PS3의 미디어는 블루레이 디스크 입니다. 기존의 DVD... ㅎㅎ 전 얼마 안있으면 출시할 PS3 갓 오브워 3 때문에... 가족이나 친구들 아는 사람들과 같이 즐기려면 컨트롤러 1개...

플로피 디스크

... 1이 담긴 플로피 디스크들 (유니코드: 1F4BE) Floppy Disk 보조 기억... 3.5인치 플로피 디스크의 자기 필름. 외부 케이스를 뜯어내고 내부의 자성체 부분만 꺼낸 것이다. ...