운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.
1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
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 … 과 같이 표현합니다.
[2, 1, 3, 2] | 2 | 1 |
[1, 1, 9, 1, 1, 1] | 0 | 5 |
예제 #1
문제에 나온 예와 같습니다.
예제 #2
6개의 프로세스 [A, B, C, D, E, F]가 대기 큐에 있고 중요도가 [1, 1, 9, 1, 1, 1] 이므로 [C, D, E, F, A, B] 순으로 실행됩니다. 따라서 A는 5번째로 실행됩니다.
<정답>
각 값과, 인덱스를 기억하는 배열을 만들어서 2차원 배열로 다시 나열.
이후에 max값과 같은 값이라면 그 값의 인덱스를 다른 배열에 넣고, 아니라면 그 비교해주기 위해 맨 앞에서 빼준 배열을 그대로 맨 뒤로 다시 붙여줌.
그렇게 모든 배열의 index값이 returnArr로 가게 되면 tempArr의 길이가 0이될 때, 그 배열을 출력하고, 그 원하는 값의 배열을 출력.
function solution(priorities, location) {
//location은 index = 0부터, return값은 index=1부터
let returnArr = [];
let currentidx = 0;
let maxNum = Math.max(...priorities);
let tempArr = [];
for(let i=0; i<priorities.length; i++){
tempArr.push([priorities[i],i]);
}
while(tempArr.length){
let [currentMax,currentidx] = tempArr.shift();
if(currentMax === maxNum){
returnArr.push(currentidx);
maxNum = 0;
for(let j=0; j<tempArr.length; j++){
maxNum = Math.max(maxNum, tempArr[j][0])
}
}else{
tempArr.push([currentMax,currentidx])
}
}
return returnArr.indexOf(location)+1
}
<다른 정답>
.some()을 통해서 모든 배열의 요소가 true, false로 바뀐다.
이후, true 값인 row값이 나올때까지 맨 앞값을 붙였다 뗏다를 splice와 push로 반복.
splice(제거 시작 idx, 제거 갯수)제거한 요소들의 배열로 return 함. 기존 배열 자체를 변경함과 동시에, 반환을 제거한 값으로 하기 때문에 이걸 새롭게 임시 장소인 cur에 할당해주었다가
내가 원하는 ture가 나올때까지 return은 하지 않되, 그전에 같은 값이지만 false한 값이 먼저나왔을 경우, count를 더해서 index 맞춰준다.
(참고)
splice(0,1) => [{my : true, val : 2}]
splice(0,1)[0] => {my : true, val : 2}
function solution(priorities, location) {
var list = priorities.map((t,i)=>({
my : i === location,
val : t
}));
var count = 0;
while(true){
var cur = list.splice(0,1)[0];
if(list.some(t=> t.val > cur.val )){
list.push(cur);
}
else{
count++;
if(cur.my) return count;
}
}
}
'🗃️javascript > 프로그래머스' 카테고리의 다른 글
기사단원의 무기(js, Lv.1)[약수는 짝으로 존재] (2) | 2024.07.03 |
---|---|
튜플(js,Lv.2)[객체의 배열화 Ojbect.entries()] (1) | 2024.07.01 |
기능개발(js, Lv.2) (0) | 2024.07.01 |
캐시(js, Lv.2) (0) | 2024.06.28 |
행렬의 곱셈(js.Lv.2) (0) | 2024.06.27 |