[프로그래머스] LV.2 - 프로세스 | 파이썬

SangJin Ham·2023년 11월 23일
0

프로그래머스

목록 보기
20/20
post-thumbnail

LV.2 - 프로세스

문제 설명

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

  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 … 과 같이 표현합니다.

입출력 예

prioritieslocationreturn
[2, 1, 3, 2]21
[1, 1, 9, 1, 1, 1]25

입출력 예 설명

예제 #1

문제에 나온 예와 같습니다.

예제 #2

6개의 프로세스 [A, B, C, D, E, F]가 대기 큐에 있고 중요도가 [1, 1, 9, 1, 1, 1] 이므로 [C, D, E, F, A, B] 순으로 실행됩니다. 따라서 A는 5번째로 실행됩니다.


코드

from collections import deque

def solution(priorities, location):

    q =  deque([(i,p) for i,p in enumerate(priorities)])
    answer = 0

    while True:
        # 먼저 하나를 꺼낸다
        cur = q.popleft()
        # 우선 순위가 높은 프로세스가 있냐 ?
        if any(cur[1] < p[1] for p in q):
            # 있으면 다시 큐에 넣기
            q.append(cur)
        # 우선 순위가 높은 프로세스가 없다면
        else:
            answer += 1             # 실행횟수 + 1
            if cur[0] == location:  # 찾으려던 프로세스라면 지금까지의 실행횟수 반환
                return answer

풀이

먼저 원하는 위치(location)의 프로세스가 실행되는 순서가 알고싶으니 q에 priorities와 i를 묶어 저장한다.

그 다음에 큐의 첫 번째 프로세스를 꺼낸다.

여기 if문에서 any라는 함수를 사용했는데 any 함수는 아래와 같다.

any : 인자로 받은 반복가능한 자료형(iterable)중 단 하나라도 참(True)이 있으면 참(True)를 반환하는 함수

아래를 보면 직관적으로 이해가 가능하다.

# 리스트
a = [1, 1, 1, 1, 1]
print(any(a)) # 모두가 참이므로 True

b = [0, 0, 1, 0, 0]
print(any(b)) # 하나가 참이므로 True

c = [0, 0, 0, 0, 0]
print(any(c)) # 한 개도 참이 없으므로 False

이 문제에서는 any 함수를 현재 꺼낸 프로세스보다 우선순위가 높은 프로세스가 하나라도 있는지 확인해주는 역할을 한다.
만약 우선순위가 높은 프로세스가 하나라도 있다면 다시 큐로 넣고, 없다면 실행횟수를 하나 늘려주고 현재 꺼낸 프로세스가 찾던 위치(location)의 프로세스라면 지금까지의 실행횟수를 반환해주고 종료된다.

profile
끄적끄적

0개의 댓글