[프로그래머스] 프로세스 (javascript)
https://school.programmers.co.kr/learn/courses/30/lessons/42587
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🤔 해결방법
1. 각 프로세스의 우선순위와 인덱스를 이중배열로 저장
2. 큐의 첫 번째 프로세스를 꺼내 나머지 프로세스들과 우선순위 비교
3. 우선순위가 높은게 있다면 현재 프로세스를 맨 뒤에 넣고 없으면 count+1
4. location과 현재 프로세스의 인덱스가 같다면 count 반환
🔑 풀이
찾고자 하는 프로세스의 위치를 알려주는 locationo 변수가 주어지기 때문에 큐에 들어있는 프로세스들의 인덱스를 기억해야 했다.
그래서 먼저 각 프로세스의 우선순위와 인덱스를 함께 저장했다.
let queue = [];
for (let i = 0; i < priorities.length; i++) {
queue.push([priorities[i], i]);
}
문제에서 주어진 규칙을 따르려면 shift로 맨 앞의 프로세스를 꺼내서 나머지 프로세스들과 순위를 비교 후 push로 맨 뒤에 넣는 작업을 반복해야했다.
그래서 queue의 첫 번째 원소를 꺼내 currentPriority와 currentIndex에 저장하고 queue에 남아있는 프로세스 중 currentPriority보다 높은 우선순위를 가진 문서가 있다면 moreHigh 변수를 true로 저장했다.
let [currentPriority, currentIndex] = queue.shift();
let moreHigh = false;
// 우선순위가 더 높은게 있는지 확인
for (let i = 0; i < queue.length; i++) {
if (queue[i][0] > currentPriority) {
moreHigh = true;
break;
}
}
moreHigh가 true라면, 현재 프로세스(currentPriority, currentIndex)를 queue의 맨 뒤로 보내고 moreHigh가 false라면 count를 1씩 증가시켜서 몇 번째로 실행되는지 카운트했다.
그리고 currentIndex가 찾고자 하는 문서의 인덱스인 location와 같다면 현재까지의 count 값을 반환하면 된다.
if (moreHigh) {
queue.push([currentPriority, currentIndex]);
} else {
count++;
if (currentIndex === location) {
return count;
}
}
최종 코드는 다음과 같다.
function solution(priorities, location) {
// 우선순위와 인덱스를 함께 저장
let queue = [];
for (let i = 0; i < priorities.length; i++) {
queue.push([priorities[i], i]); // queue = [[2,0], [1,1], [3,2], [2,3]]
}
let count = 0; // 몇 번째로 출력되는지 카운트하는 변수
while (true) {
let [currentPriority, currentIndex] = queue.shift();
let moreHigh = false;
// 우선순위가 더 높은게 있는지 확인
for (let i = 0; i < queue.length; i++) {
if (queue[i][0] > currentPriority) {
moreHigh = true;
break;
}
}
if (moreHigh) {
queue.push([currentPriority, currentIndex]);
} else {
count++;
if (currentIndex === location) {
return count;
}
}
}
}
나는 나머지 프로세스들과 우선순위를 비교할 때 for문을 사용했는데 다른 분들의 풀이를 보니 some() 메서드를 사용해서 더 간단하게 풀 수도 있었다.
내 풀이에서 some을 사용하면 다음과 같이 풀 수 있겠다.
let queue = [];
for(let i = 0; i < priorities.length; i++) {
queue.push([priorities[i], i]);
}
let answer = 0;
while(queue.length > 0) {
let [currentPriority, currentIndex] = queue.shift();
if(queue.some(doc => doc[0] > currentPriority)) {
queue.push([currentPriority, currentIndex]);
} else {
answer++;
if(currentIndex === location) break;
}
}
some() 메서드는 주어진 판별 함수를 적어도 하나라도 통과하는지 테스트하는 메서드라 한다.
또한 주어진 함수를 만족하면 true를 반환하고 그렇지 않으면 false를 반환하며, 배열을 변경하지 않는다고 한다.
some 사용에 익숙해져야겠다..!🤔