JS-algorithm/프로그래머스

[프로그래머스] 프로세스 (javascript)

yunieyunie 2023. 9. 4. 15:44

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 사용에 익숙해져야겠다..!🤔