[프로그래머스] 프로세스 문제 풀이 - JavaScript

Haizel·2023년 11월 8일
1

🧬 알고리즘 풀이

목록 보기
49/53
post-thumbnail

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

문제

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

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

입/출력 예시

console.log(solution([2, 1, 3, 2], 2)); // 1
console.log(solution([1, 1, 9, 1, 1, 1], 0)); // 5

✍️ Solution1

function solution(priorities, location) {
  const nQueue = [...priorities]; 
  const indexQueue = priorities.map((_, i) => i); 
  const outTurn = []; 

  while (nQueue.length > 0) {
    if (outTurn.at(-1) === location) {
      break;
    }

    let maxN = Math.max(...nQueue);

    if (nQueue[0] === maxN) {
      outTurn.push(indexQueue[0]);
    } else {
      nQueue.push(nQueue[0]);
      indexQueue.push(indexQueue[0]);
    }
    nQueue.shift();
    indexQueue.shift();
  }
  return outTurn.length;
}

👉 Solution1 해설

  1. priorites를 담은 queue와 priorites의 순서를 담은 queue를 각각 만들고, priorites가 나온 순서를 저장하는 빈배열을 하나 만든다.
  2. priorites에서 맨 처음 숫자를 꺼내 꺼낸 숫자가 최고 우선 순위라면 순서 를 저장하는 배열에 추가한다.
  3. 이때 해당 요소의 index가 loacation과 같다면 while문을 빠져나온다.
  4. 아니라면 각 배열의 마지막으로 push하고, 맨 앞에 숫자, 인덱스 삭제한다.
  5. 최종적으로 순서를 저장하는 배열의 length를 리턴한다.

✍️ Solution2

function solution(priorities, location) {
  let result = 0;

  const list = priorities.map((t, i) => ({
    location: i === location,
    priority: t,
  }));

  while (true) {
    const firstEle = list.shift();
    const ListhasMoreHighPriority = list.some(
      (el) => el.priority > firstEle.priority
    );

    if (ListhasMoreHighPriority) {
      list.push(firstEle);
    } else {
      result++;
      if (firstEle.location) {
        return result;
      }
    }
  }
}

👉 Solution2 해설

  1. list라는 배열을 선언하고, location과 index의 일치여부, 그리고 숫자의 값을 객체로 담는다.
  2. shift를 이용해 list의 첫번째 요소를 뽑는다.
  3. ListhasMoreHighPriority 라는 변수를 선언하고 some 메서드로 list 안에 뽑은 첫번째 요소보다 더 높은 우선 순위가 있는지 확인한다.
  4. 만약 list 안에 더 높은 우선순위인 숫자가 있으면(true) 해당 요소를 list의 맨뒤에 push한다.
  5. 뽑은 숫자가 가장 크다면 result에 1을 더한다.
  6. 이때 뽑은 요소의 location이 true라면 즉시 result를 리턴한다.
profile
한입 크기로 베어먹는 개발지식 🍰

0개의 댓글