[4주차 기본문제 2] 프로세스

BossTeemo·2024년 7월 11일
0

알고리즘스터디

목록 보기
12/19
post-thumbnail
post-custom-banner

문제 설명

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

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

예를 들어 프로세스 4개 [A, B, C, D]가 순서대로 실행 대기 큐에 들어있고, 우선순위가 [2, 1, 3, 2]라면 [C, D, A, B] 순으로 실행하게 됩니다.

현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • priorities의 길이는 1 이상 100 이하입니다.
  • priorities의 원소는 1 이상 9 이하의 정수입니다.
  • location은 0 이상 (대기 큐에 있는 프로세스 수 - 1) 이하의 값을 가집니다.

입출력 예

  • 입력: [2, 1, 3, 2], 2

  • 출력: 1

  • 입력: [1, 1, 9, 1, 1, 1], 0

  • 출력: 5


문제 해결 방법

  1. 각 프로세스를 큐에 넣고, 프로세스의 인덱스와 우선순위를 함께 저장합니다.
  2. 큐에서 프로세스를 하나씩 꺼내어, 현재 프로세스보다 우선순위가 높은 프로세스가 있는지 확인합니다.
  3. 높은 우선순위의 프로세스가 있으면 현재 프로세스를 다시 큐에 넣습니다.
  4. 그렇지 않으면 현재 프로세스를 실행하고, 실행 순서를 기록합니다.
  5. 원하는 위치의 프로세스가 실행되면 그 순서를 반환합니다.

해결 전략

큐 자료구조를 사용하여 문제를 해결합니다. 각 프로세스를 큐에 저장하고, 우선순위에 따라 올바른 순서대로 프로세스를 실행합니다.

코드 구현

function solution(priorities, location) {
    var answer = 0;
    var queue = priorities.map((priority, index) => {
        return { index: index, priority: priority };
    });

    while (queue.length > 0) {
        var current = queue.shift();
        if (queue.some(process => process.priority > current.priority)) {
            queue.push(current);
        } else {
            answer++;
            if (current.index === location) {
                return answer;
            }
        }
    }
    return answer;
}

코드 설명

  1. 큐 초기화:

    • priorities 배열의 각 요소를 {index: index, priority: priority} 형태의 객체로 변환하여 큐를 초기화합니다. 각 객체는 프로세스의 원래 위치와 우선순위를 저장합니다.
    var queue = priorities.map((priority, index) => {
        return { index: index, priority: priority };
    });
  2. 큐 처리:

    • 큐가 빌 때까지 반복합니다.
    • 큐의 맨 앞 요소를 꺼냅니다.
    • 큐 내에 현재 요소보다 우선순위가 높은 요소가 있는지 확인합니다.
    • 높은 우선순위의 요소가 있으면 현재 요소를 다시 큐의 맨 뒤에 추가합니다.
    • 그렇지 않으면 현재 요소를 실행하고, 실행된 횟수를 증가시킵니다. 현재 요소가 우리가 찾는 위치의 요소라면 answer를 반환합니다.
    while (queue.length > 0) {
        var current = queue.shift();
        if (queue.some(process => process.priority > current.priority)) {
            queue.push(current);
        } else {
            answer++;
            if (current.index === location) {
                return answer;
            }
        }
    }

예시 테스트

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

이 코드는 주어진 예시 입력에 대해 올바른 결과를 출력합니다. 우선순위에 따라 프로세스가 정확한 순서로 실행되며, 원하는 프로세스의 실행 순서를 반환합니다.


결론

이번 포스팅에서는 프로세스의 우선순위를 고려한 실행 순서를 구하는 방법을 살펴보았습니다. 큐 자료구조를 사용하여 문제를 효과적으로 해결할 수 있으며, 코딩 테스트 준비에 도움이 되길 바랍니다. 다음 포스팅에서는 또 다른 문제로 찾아뵙겠습니다. 감사합니다!

profile
1인개발자가 되겠다
post-custom-banner

0개의 댓글