게으른개발너D

[JS] Stack/ Queue - 프로세스 본문

알고리즘/문제

[JS] Stack/ Queue - 프로세스

lazyhysong 2023. 9. 6. 18:02

https://school.programmers.co.kr/learn/courses/30/lessons/42587

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

운영체제의 역할 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 번째로 실행되는지 알아내면 됩니다.

  1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
  2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
  3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
    1. 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.

예를 들어 프로세스 4개 [A, B, C, D]가 순서대로 실행 대기 큐에 들어있고, 우선순위가 [2, 1, 3, 2]라면 [C, D, A, B] 순으로 실행하게 됩니다.

현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.

 

제한 사항

  • priorities의 길이는 1 이상 100 이하입니다.
    • priorities의 원소는 1 이상 9 이하의 정수입니다.
    • priorities의 원소는 우선순위를 나타내며 숫자가 클 수록 우선순위가 높습니다.
  • location은 0 이상 (대기 큐에 있는 프로세스 수 - 1) 이하의 값을 가집니다.
    • priorities의 가장 앞에 있으면 0, 두 번째에 있으면 1 … 과 같이 표현합니다.

입출력 예

priorities location return
[2, 1, 3, 2] 2 1
[1, 1, 9, 1, 1, 1] 0 5
[1, 3, 8, 1]
3 3

 


solution 1

shift() 이용

function solution(priorities, location) {
    const sortedPriority = [...priorities].sort((a, b) => b - a);
    let runIdx = 0;
    while(priorities.length) {
        const pri = priorities.shift();
        if(pri < sortedPriority[0]) {
            priorities.push(pri);
            if(location === 0) {
                location = priorities.length - 1;
            } else {
                location--;
            }
        } else {
            sortedPriority.shift();
            runIdx++; 
            if(location === 0) {
                break;
            } else {
                location--;
            }
        }
    }
    return runIdx;
}

 

Array.prototype.some 을 이용하여 내림차순으로 sort 하는 과정 없애기

function solution(priorities, location) {
    let runIdx = 0;
    while(priorities.length) {
        const pri = priorities.shift();
        if(priorities.some((a) => a > pri)) {
            priorities.push(pri);
            if(location === 0) {
                location = priorities.length - 1;
            } else {
                location--;
            }
        } else {
            runIdx++; 
            if(location === 0) {
                break;
            } else {
                location--;
            }
        }
    }
    return runIdx;
}

 

Obejct로 location에 위치한 target element를 표시하여 해당 조건에 있는 수를 편리하게 찾기

function solution(priorities, location) {
    priorities = priorities.map((a, i) => ({
      target: location === i,
      value: a,
    }));
    let runIdx = 0;
    while(priorities.length) {
        const pri = priorities.shift();
        if(priorities.some((a) => a.value > pri.value)) {
            priorities.push(pri);
        } else {
            runIdx++; 
            if(pri.target) {
              break;
            }
        }
    }
    return runIdx;
}

 

 

 

solution 2

delete 이용

function solution(priorities, location) {
    let answer = 0;
    const PRI_SIZE = priorities.length;
    const priorArr = [...priorities].sort((a, b) => b - a);
    let maxIdx = 0; // 최댓값 순서
    let i = 0; // priorities 순서
    let idx = 0; // 대기목록 순서
    while(priorities.length > 0) {  
        const value = priorities[i];
        delete priorities[i];
        if(value < priorArr[maxIdx]) {
            priorities[PRI_SIZE + idx] = value;
            if(i === location) {
                location = PRI_SIZE + idx;
            }
            idx++;
        } else {
            maxIdx++;
            if(i === location) {
                answer = maxIdx;
                break;
            }
        }
        i++;
    }

    return answer;
}
function solution(priorities, location) {
    const len = priorities.length;
    priorities = priorities.map((p, i) => ({
        target: i === location,
        value: p,
    }));
    let maxIdx = 0; // 최댓값 순서
    let i = 0; // priorities 순서
    let idx = 0; // 대기목록 순서
    while(priorities.length > 0) {  
        const pri = priorities[i];
        delete priorities[i];
        if(priorities.some(p => p.value > pri.value)) {
            priorities[len + idx] = pri;
            idx++;
        } else {
            maxIdx++;
            if(pri.target) {
                break;
            }
        }
        i++;
    }

    return maxIdx;
}
Comments