본문 바로가기

코딩테스트

[프로그래머스] level3. 디스크 컨트롤러 (javascript)

반응형

문제

프로그래머스 문제 링크

나의 풀이

틀려서 다른 블로그를 보고 공부하였습니다.

 

[프로그래머스/Javascript] 디스크 컨트롤러 - Kyun2da Blog

1️⃣서론

Kyun2da.github.io

 

function solution(jobs) {
    let j = 0;
    let time = 0;
    let sum = 0;
    let priorityQueue = []
    jobs.sort((a,b)=>a[0]-b[0])

    while(jobs.length>j || priorityQueue.length !==0){
        if(jobs.length>j && time >= jobs[j][0]){
            priorityQueue.push(jobs[j++]);
            priorityQueue.sort((a,b)=>{
                return a[1]- b[1]
            })
            continue
        }
        if(priorityQueue.length !== 0 ){
            time += priorityQueue[0][1];
            sum += time - priorityQueue[0][0]

            priorityQueue.shift()
        } else{
            time = jobs[j][0]
        }

    }

    return Math.floor(sum/jobs.length);
};

풀이

  • 프로그래머스에서 heap 문제로 분류되어 있어 heap을 찾아보면 풀이랑 결이 다르는 걸 느낄 것입니다.
  • Javascript에서는 따로 heap을 제대로 사용하려면 아래 블로그 처럼 직접 class로 구현을 해야된다.
    HEAP 구현하기 블로그
  • 따라서 우선순위 큐라는 개념만 이용해서 풀이를 하였다.
  • 조건에 맞는 데이터들을 우선순위 큐에 옮기고, 이를 먼저 처리하는 방식입니다.

 

 

코드 분석 도움

  • 테스크 케이스에서는 괜찮은데, 실제 채점을 할 때 주어지는 jobs데이터는 정렬이 되어있지 않은 상태로 주어지기에 처음에 sort를 해주고 시작해야됩니다.
  • while을 ||(or)로 조건을 주어서 두가지 모두 해당 되지 않을때 멈추도록 해주었다.
  • 제일 먼저 time보다 같거나 작은 경우를 전부 우선순위 큐에 넣어줍니다.
  • j++ 을 이용해서 j가 매번 증가하는게 아니라, 조건에 부합할때만 증가하도록 하였습니다.
  • continue를 사용해서 가장 우선시 되는 조건에 만족하면 다른 작업은 안하도록 처리해주었다.
  • 우선순위 큐에서 가장 처리시간이 작은 작업순으로 sort를 해줍니다.
  • 우선순위 큐에 들어갈 것이 모두 들어갔다면, 하나씩 shift로 처리해준다. (time 재설정, 총합 더하기)
  • 마지막으로 조건에 전부 해당되지 않는 데이터가 있는데, jobs 데이터가 남았다면 time을 재설정해주어 처리해준다.

 

배운점

  • shift()로 무작정 지워가면서 처리하는게 아닌, 우선순위 큐라는 새로운 저장 공간을 만들고, 조건에 해당되면 데이터를 옮겨놓고 이를 먼저 처리한다는 개념을 배웠습니다.
반응형