[Algorithm] 멀리뛰기
공부

[Algorithm] 멀리뛰기

작성일: 2023년 10월 18일

문제설명

멀리뛰기는 실행 우선도가 담긴 배열과 찾고자 하는 인덱스 정보를 받아 실행되는 인덱스의 순서를 반환하는 문제로 조건은 아래와 같다.

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

문제해결

  • 배열의 요소와 인덱스를 키와 값으로 묶은 객체 배열 process를 만든다.
  • [1, 1, 9, 1, 1, 1] => [{1,0},{1,1},{9,2},{1,3},{1,4},{1,5}]

  • process를 순회하며 제일 앞에 있는 요소를 꺼낸다.
  • queue = process.shift()

  • 우선순위가 더 높은 요소를 찾는다.
  • process.some({요소,인덱스} => 전체 배열의 요소 > queue의 요소)

  • 우선순위가 더 높은 요소가 있다면 process 배열 맨 뒤에 queue를 넣는다.
  • 우선순위가 더 높은 요소가 없다면 반환값에 1을 더하고 queue의 인덱스 정보와 location의 값이 같다면 반복문을 종료한다.
  • function solution(priorities, location) {
      let answer = 0;
      const process = priorities.map((e, i) => ({ e, i })); // [{1,0},{1,1},{9,2},{1,3},{1,4},{1,5}]
      while (process.length) {
        const queue = process.shift();
        if (process.some((e) => e.e > queue.e)) {
          process.push(queue);
        } else {
          answer++;
          if (queue.i === location) break;
        }
      }
      return answer;
    }