반응형
문제
나의 풀이
틀려서 다른 블로그를 보고 공부하였습니다.
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()로 무작정 지워가면서 처리하는게 아닌, 우선순위 큐라는 새로운 저장 공간을 만들고, 조건에 해당되면 데이터를 옮겨놓고 이를 먼저 처리한다는 개념을 배웠습니다.
반응형
'코딩테스트' 카테고리의 다른 글
[프로그래머스] level3. 순위 (javascript) (0) | 2021.12.07 |
---|---|
[프로그래머스] level3. 가장 먼 노드 (javascript) (0) | 2021.11.19 |
[프로그래머스] level1. 위클리 챌린지 2주차 (javascript) (0) | 2021.09.02 |
[프로그래머스] level2. 큰 수 만들기 (javascript) (0) | 2021.09.01 |
[프로그래머스] level2. [3차] 압축 (javascript) (0) | 2021.08.31 |