[프로그래머스 | Javascript] 프로세스

박기영·2023년 9월 22일
0

프로그래머스

목록 보기
126/159

solution

function solution(priorities, location) {    
    let queue = Array.from({ length: priorities.length }, (v, i) => i);
    let max = Math.max(...priorities);
    let count = 0;
    
    while(queue.length){
        const shiftedLocation = queue.shift();
        const shiftedPriority = priorities.shift();
        
        if(shiftedPriority < max){
            queue.push(shiftedLocation);
            priorities.push(shiftedPriority);
            continue;
        }
        
        count++;
        
        if(shiftedLocation === location){
            return count;
        }
        
        max = Math.max(...priorities);
    }
}

이 문제는 처음 주어진 priorities에서 location 인덱스에 해당하는 프로세스가 언제 처리되는지 구하는 것이 목표이다.

여기서 어떤 점을 신경 써야하는지 적어보자면...

  1. 프로세스를 다루는 큐는 언제든지 길이가 변할 수 있다.
  2. 1번으로 인해 인덱스 또한 프로세스 처리에 따라 계속해서 변한다.

따라서, location은 고정된 지표로 활용하기 매우 힘들다.
즉, 별도의 지표를 만들어줄 필요가 있다.

필자는 두 개의 queue를 사용하는 것으로 이를 해결했다.
하나의 queue는 문제에서 주어진 priorities를 그대로 사용한다.
다른 queue는 각 프로세스의 초기 인덱스를 담고 있는 것으로, location과의 비교를 위해 사용한다.

문제 풀이의 원리는 일반적인 큐 문제와 같다.
priorities에서 shift()한 프로세스의 우선 순위가 max보다 작으면 처리하지 않고 prioritiespush()한다.
마찬가지로, queue에 대해서도 동일하게 처리해준다.
이 때, queue는 초기 프로세스의 인덱스를 담고 있으므로, 순서가 바뀌어도 여전히 특정 프로세스의 location을 기억하고 있다.

위 과정을 반복하면서 실행 횟수인 count를 증가시킨다.
이 때, count는 정상적으로 프로세스가 처리되었을 때만 증가시켜야한다.
그렇지 않으면 처리된게 아니라 다시 큐에 들어온 것까지 실행 횟수로 계산해버리기 때문이다.

만약, 정상 처리된 프로세스의 초기 인덱스, 즉, queue에 담겨있는 프로세스의 인덱스가
문제에서 주어진 location과 같다면 이 프로세스가 처리되었을 때의 실행 횟수가 정답이므로
count를 반환한다.

다른 분의 solution

function solution(priorities, location) {
    var arr = priorities.map((priority, index) => {
        return {
            index: index, priority: priority
        };
    });

    var queue = [];

    while(arr.length > 0) {
        var firstEle = arr.shift();
        var hasHighPriority = arr.some(ele => ele.priority > firstEle.priority);
        if (hasHighPriority) {
            arr.push(firstEle);
        } else {
            queue.push(firstEle);
        }
    }

    return queue.findIndex(queueEle => queueEle.index === location) + 1;
}

필자가 초반에 시도했다가, 대소 연산에서 어려움을 겪어 포기했던 접근법이다.
some() 메서드를 사용하셨는데, 왜 이걸 생각 못했을까 싶다.
필자가 생각하는 이상적인 풀이이다!

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글