본문 바로가기
개발공부_Blog/Algorithm

프로그래머스 - 프로세스

by 소팡팡 2024. 11. 17.

😀 프로세스 [ 스택 / 큐 ]

https://school.programmers.co.kr/learn/courses/30/lessons/42587

 

문제 설명

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

 

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

 

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

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

 

제한사항

(1) priorities의 길이는 1 이상 100 이하입니다.
    - priorities의 원소는 1 이상 9 이하의 정수입니다.
    - priorities의 원소는 우선순위를 나타내며 숫자가 클 수록 우선순위가 높습니다.
(2) location은 0 이상 (대기 큐에 있는 프로세스 수 - 1) 이하의 값을 가집니다.
    - priorities의 가장 앞에 있으면 0, 두 번째에 있으면 1 … 과 같이 표현합니다.

 

 

첫번째 테스트케이스가 여럿.. 막혔던 풀이

function solution(priorities, location) {
  var answer = 0;
  let queue = [];

  // 우선순위 작업 찾기
  const max = Math.max(...priorities);
  const maxIndex = priorities.indexOf(max);
  priorities[location] = 0;

  // 우선순위 작업 순서의 대기열 생성
  for (let i = 0; i < maxIndex; i++) {
    priorities.push(priorities[i]);
  }

  for (let i = maxIndex; i < priorities.length; i++) {
    queue.push(priorities[i]);
  }
  return (answer = queue.indexOf(0) + 1);
}

 

가장 큰 문제점은 문제를 제대로 이해하지 못했다는 점이다!.. 예제를 이해하는 풀이로 코드를 작성했다.

  • 문제의 요구사항은 특정 우선순위가 아닌 큐를 활용하여 배열을 동적으로 재배치하는 것이었는데, 나는 우선순위 값과 인덱스를 활용해 배열을 재정렬 하고 문제를 해결하려 했다.
  • location과 비교하려는 대상에 0을 입력하여 해당 배열의 위치를 추적하려고 했었닼ㅋㅋ ///_ /// 하지만 이는 큐를 순환하며 우선순위를 찾는 과정에서 문제를 일으킬 수 있다. 프로세스의 위치를 따로 관리하는 것이 필요했다.

 

두번째 풀이

이 문제를 풀면서 어려웠던 점은 "위치배열"을 만드는 부분이었다.
우선순위 배열 값에서 최대값보다 작은 값들을 shift하여서 해당 배열의 끝에 pop을 하는 것은 어렵지 않았지만 locaiton과 대조시킬 위치값을 너무 어렵게 생각했었다. 반복문을 사용해 priorities와 같은 길이의 배열을 생성하고 이를 위치배열로 지정하였다.

 

while문을 통해 priorities의 배열 길이가 0이 되기 전까지 반복적인 작업을 계속 하도록 했다. 작업 내용은 다음과 같다.

  • priorities의 배열 내에서 최대값을 찾아서 현재 0번 인덱스의 값과 비교한다
  • 최대값보다 작으면 프로세스를 실행시킬 수 없으므로 priorities의 배열 맨 뒤로 이동시킨다
  • 최대값보다 크면 프로세스를 실행시켜야 하므로 answer의 값을 +1 올리고 해당 배열에서 제거한다. 이때 locationArr의 값고 같이 제거 시켜 해당 위치를 지운다.
  • 배열에서 제거한 인덱스와 문제에서 주어진 locaion이 같은지 비교한 뒤, 값이 같으면 answer를 return하게 한다. 값이 같지 않으면 while반복문을 계속 실행한다.
function solution(priorities, location) {
  var answer = 0;
  let locationArray = [];

  // 위치배열 만들기
  for (let i = 0; i < priorities.length; i++) {
    locationArray.push(i);
  }
 
  while (priorities.length > 0) {
    const maxNumber = Math.max(...priorities);
    if (maxNumber > priorities[0]) {
      priorities.push(priorities.shift());
      locationArray.push(locationArray.shift());
    } else {
      answer += 1;
      priorities.shift();
      const locationShift = locationArray.shift();
      if (locationShift === location) {
        return answer;
      }
    }
  }
}
console.log(solution([2, 1, 3, 2], 2)); //1
console.log(solution([1, 1, 9, 1, 1, 1], 0)); //5
console.log(solution([4, 2, 5, 3, 4], 3)); // 4

 

 

'개발공부_Blog > Algorithm' 카테고리의 다른 글

프로그래머스-주식가격  (1) 2024.11.18
Data Structure - Tree  (0) 2024.10.29
Data Structure - Hash Table  (0) 2024.10.29
Data Structure - Stack  (0) 2024.10.29
Data Structure - Queue  (0) 2024.10.29

댓글