
운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.
- 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
- 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
- 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.
현재 실행 대기 큐(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 [C, D, A, B] 순으로 실행
#2 [C, D, E, F, A, B] 순으로 실행
일반적인 우선순위 큐와는 약간 다른 방식을 가지고 있습니다. 큐에서 최댓값을 발견할 경우 앞에 꺼내두었던 값들을 다시 큐에 넣는데, 뒤쪽으로 넣습니다. 예를 들어 [1, 3, 2] 라면, [3, 2, 1] 순으로 바꿉니다. 그 후 첫 번째 값이 최대값이라면 해당 프로세스를 실행한 후 큐에서 지웁니다. 이 과정을 반복하는데, 만약 방금 실행된 프로세스가 원래 priories 에서 location 번째 있었다면, 그게 몇 번째로 실행된 건지를 구하면 됩니다.
우선 queue와 index 배열을 만들어 각각 priories의 값과, 인덱스를 차례로 넣어줍니다. 횟수를 세는 count 변수도 선언합니다.
for문으로 priories의 길이만큼 돌면서, 해당 queue 안의 최댓값을 구합니다.
최댓값이 가장 먼저 실행되어야 하므로 첫 번째 값이 최대 값이 되기 전까지 맨 앞의 요소를 꺼내 맨 뒤로 넣습니다.
만약 반복하여 최대 값이 되었다면 이제 프로세스를 실행할 것으므로 count 값을 하나 증가시켜주고, location 값과 비교하여 맞다면 더 이상 함수를 실행하지 않고 반환합니다.
만약 아직 아니라면, 첫 번째 (현재 최대값)과 해당 인덱스 값을 반복합니다.
이 과정을 반복하여 구합니다.
function solution(priorities, location) {
let queue = [...priorities];
let index = [...Array(priorities.length).keys()];
let count = 0;
for (let i = 0; i < priorities.length; i++) {
let max = Math.max(...queue);
while (queue[0] < max) {
queue.push(queue.shift());
index.push(index.shift());
}
if (queue[0] === max){
count++;
if (index[0] === location){
return count;
}
queue.shift();
index.shift();
}
}
}
let index = [...Array(priorities.length).keys()];
Array(priorities.length)는 길이가 priorities.length인 새 배열 생성합니다. ( Array(3)은 길이가 3인 빈 배열 )
.keys()는 해당 배열의 각 인덱스 값을 반환하며, ... 는 값들을 배열로 펼쳐서 새 배열로 반환합니다.