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

IT공부중·2020년 4월 27일
0

알고리즘

목록 보기
18/49

https://programmers.co.kr/learn/courses/30/lessons/42627

해당 문제는 Heap으로 분류되어 있으며 파이썬으로 풀면 heapq나 우선순위 큐를 사용하면 될 것 같은데 javascript로는 찾아봐도 그런 구현 되어 있는 것을 찾지 못 해서 어떻게 해야하는지 알 수 없었습니다. 그래서 python으로 푼 다음에 다른 분의 js 풀이를 보고 따라 쳐보고 이해 한 뒤 쓰는 글입니다.

function solution(jobs) {
    let total = jobs.length; // 전체 길이를 둡니다. 
    let answer = 0; // 총 기다린 시간을 저장하는 변수
    let now = 0; // 현재 시간
    let queue = []; // 작업 진행 예정

    while(true) {
        let index = 0;
        while(true) {
            if (index >= jobs.length) break;
            if (jobs[index][0] <= now) { // 현재 시간 보다 시작 시간이 작은 값들을 작업 진행 예정 배열에 넣습니다. splice를 하면 배열이 되기 때문에 0번째 인덱스를 넣어줍니다.
                queue.push(jobs.splice(index,1)[0]);
            } 
            else { // 아닐 경우 다음 index
                index += 1;
            }
        }

        if (queue.length === 0) { // 만약에 queue에도 아무것도 없고
            if (jobs.length === 0) { // jobs에도 아무것도 없다면 반복문을 끝낸다.
                break; // 끝
            }
            else { // jobs에는 남아 있을 경우 현재 시간이 1 지났다고 하고 넘어갑니다.
                now += 1;
            }
        }
        else { // queue에 있을 경우
            let minIndex = 0;
            for(let i = 1; i < queue.length; i ++) {
                if (queue[minIndex][1] > queue[i][1]]) {
                    minIndex = i; // queue 중에 소요 시간이 가장 작은 값을 할 것입니다.
                }
            };
            now += queue[minIndex][1]; // 현재 시간이 소요 시간만큼 지났다고 해주고.
            answer += now - queue[minIndex][0]; // 현재시간에서 - 요청된 시간을 빼주면 작업의 요청부터 종료까지 걸린시간이 됩니다.

            queue.splice(minIndex, 1); // 해당 index를 queue에서 없애줍니다.
        }
    }

    return Math.floor(answer/total); // 전체의 평균.
}
profile
3년차 프론트엔드 개발자 문건우입니다.

2개의 댓글

comment-user-thumbnail
2020년 5월 9일

감사합니다 글 잘봤습니다.

if (queue[minIndex[1] > queue[i][1]]) {

이 라인

if (queue[minIndex][1] > queue[i][1]) {
로 고치면 좋을거 같습니다!

1개의 답글