https://programmers.co.kr/learn/courses/30/lessons/42627
function solution(jobs) {
// 먼저 오는 순서대로 정렬.
jobs.sort((a,b)=>a[0] - b[0]);
console.log(jobs);
let pq = []; // 시작가능한 일들이 들어가며 작업시간 오름차순 정렬
let i = 0, time = 0;
let answer = 0;
while (i < jobs.length || pq.length != 0) { // 우선순위큐가 빌때까지
console.log(`jobslen : ${jobs.length}, pqlen : ${pq.length}, i:${i}`);
// 우선순위큐 넣기.
if (i < jobs.length && jobs[i][0] <= time) {
console.log(`jobs[i][0] : ${jobs[i][0]}, time : ${time}`)
console.log(`before pq : ${pq}`)
pq.push(jobs[i]);
i++;
console.log(`after : ${pq}`)
pq.sort((a, b) => a[1] - b[1]);
console.log(`sort : ${pq}`)
console.log();
continue;
}
// 도착한 작업이 없을 때
if (pq.length == 0) {
console.log(pq)
time = jobs[i][0];
console.log(`time : ${time}`);
} else {
const [start, work] = pq.shift();
console.log(`start : ${start}, work : ${work}`);
answer += time + work - start;
time += work;
console.log(`answer : ${answer}, time : ${time}`)
console.log();
}
}
return parseInt(answer/jobs.length);
}
let jobs = [[0, 3], [1, 9], [2, 6], ]
console.log(solution(jobs));
우선 못 풀었다.
정렬을 해서 모든 조합의 수를 다 생각해야하나?라고 생각하면서 했지만, 실패했다.
그래서 다른 사람의 코드를 보고 console로 찍어보면서 이해했다.
우선 먼저 들어오는 순서로 정렬을한다.
그 다음 i가 jobs길이가 커지고, pq가 빌 때까지 반복한다.
우선 첫번째 [0,3]이 들어 올 때 첫 번째 if문에 들어가서 pq에 push된다.
pq = 0,3
그 다음 i는 1이 되고, jobs[i][0] <= time 때문에 아래쪽 if-else로 가게된다.
pq가 0이 아니므로 else문에 들어가고, start = 0, work = 3
answer는 여태 걸린 시간(time) + 일이 걸리는시간(work) - 시작시간(start).
time은 work를 더 해준다.
다음 pq는 비게되고, i=1이다.
그 다음 [1,9]가 위처럼 pq에 들어가게 되고, 이 때 time=3이기 때문에 그 뒤의 [2,6]도 pq에 들어가고, 답이 도출되게 된다.
console창
[ [ 0, 3 ], [ 1, 9 ], [ 2, 6 ] ]
jobslen : 3, pqlen : 0, i:0
jobs[i][0] : 0, time : 0
before pq :
after : 0,3
sort : 0,3
jobslen : 3, pqlen : 1, i:1
start : 0, work : 3
answer : 3, time : 3
jobslen : 3, pqlen : 0, i:1
jobs[i][0] : 1, time : 3
before pq :
after : 1,9
sort : 1,9
jobslen : 3, pqlen : 1, i:2
jobs[i][0] : 2, time : 3
before pq : 1,9
after : 1,9,2,6
sort : 2,6,1,9
jobslen : 3, pqlen : 2, i:3
start : 2, work : 6
answer : 10, time : 9
jobslen : 3, pqlen : 1, i:3
start : 1, work : 9
answer : 27, time : 18
9