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

ddurru·2024년 12월 2일
0

코딩테스트

목록 보기
8/15

문제 설명
운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.
1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.

예를 들어 프로세스 4개 [A, B, C, D]가 순서대로 실행 대기 큐에 들어있고, 우선순위가 [2, 1, 3, 2]라면 [C, D, A, B] 순으로 실행하게 됩니다.
현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.

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

풀이

  1. 숫자가 클 수록 우선순위가 높음
  2. return으로 현재 location에 있는 숫자가 몇 번째에 실행되는지 추출
from collections import deque

def solution(priorities, location):
    answer = 0
    queue = deque([(i, p) for i, p in enumerate(priorities)]) 
    
    while queue: 
        current = queue.popleft() # 튜플 형태로 들어가있음 
        
        # 현재 프로세스보다 높은 우선순위가 큐에 있을 경우 
        if any(current[1] < q[1] for q in queue):
            queue.append(current)
            
        # 현재 프로세스가 우선순위가 높거나 같을 경우 
        else:
            answer += 1
            # 위치같다면 answer return 
            if current[0] == location:
                return answer

프로세스 우선순위에 따라서 프로세스를 빼고 넣고 하는 방식을 고려하기 위해 deque를 사용하고자 했다.
처음에는 location을 고려하지 못하고 무작정 진행했었으나 location을 고려하여 프로세스의 실행 순서를 구해야 한다는 점을 인지하게 되었다.

따라서, 인덱스를 활용하여 위치를 알고자 하였으며 인덱스 포함하여 튜플 형식 리스트화 queue = deque([(i, p) for i, p in enumerate(priorities)]) 하였다.

이후, popleft()를 활용하여 왼쪽 끝에서부터 데이터를 제거 및 반환하고자 했다. current = queue.popleft() 앞에서 튜플 형식을 통해 queue를 불러왔기 때문에 이후에 원소를 활용하고자 한다면 curruent[1]처럼 원소를 불러와야 한다.

계속해서 queue가 빌때까지 (1) 현재 프로세스보다 높은 우선순위가 큐에 있을 경우if any(current[1] < q[1] for q in queue) 다시 queue의 뒤에 원소를 넣어주고, (2) 현재 프로세스가 우선순위가 높거나 같을 경우 location과 현재 불러온 원소의 위치를 비교하여 answer를 return 하도록 했다.

profile
2024.04.15 ~

0개의 댓글