NIRVANA

[level 2] 프로세스 본문

Coding test(Python3)/Programmers

[level 2] 프로세스

녜잉 2024. 7. 10. 12:33

1. 문제

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

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

 


 

2. 문제 풀이

1)  queue에 원소가 있는 동안 반복한다.

2) popleft()함수를 사용하여 큐에서 첫번째 원소를 꺼낸 후, 각각 process와 priority로 선언한다.

3) 만약 큐가 비어있는 상태이거나(즉, 꺼낸 원소가 마지막 원소였거나) 꺼낸 우선순위가 큐에 있는 우선순위 보다 높거나 같으면 answer에 +1한뒤, process가 location과 같은지 비교한다. 만약 확인하고 싶던 프로세스가 맞다면, answer를 반환한다. 

4) 둘 다 해당하지 않는 다면, queue에 다시 process와 priority를 추가한다. 

from collections import deque
def solution(priorities, location):
    answer = 0
    queue = deque(enumerate(priorities))
    
    while queue:
        process, priority = queue.popleft()
        
        if not queue or priority >= max(queue, key=lambda x:x[1])[1]:
            answer +=1
            if process == location:
                return answer
        else:
            queue.append((process, priority))
                   
    return answer

 

 


3. 다른 사람들 풀이 

def solution(priorities, location):
    queue =  [(i,p) for i,p in enumerate(priorities)]
    answer = 0
    while True:
        cur = queue.pop(0)
        if any(cur[1] < q[1] for q in queue):
            queue.append(cur)
        else:
            answer += 1
            if cur[0] == location:
                return answer

 

any(iterable) 함수는 인자로 얻은 반복 가능한 자료형 중단 하나라도 참이 있으면 참을 반환하는 함수이다.

즉, 현재 우선순위가 큐의 우선순위보다 작을 경우에는 다시 queue에 (프로세스, 우선순위)를 추가하고, 아니라면 answer에 1을 더한 뒤, location을 확인하여 answer 반환 여부를 확인하는 형식이다. 

 

나는 max함수를 사용했는데, 이분은 any함수를 사용하여서 큐에 남아 있는 모든 우선순위랑 비교를 하셨다.

any함수 처음 봤는데 기억해둬야겠음! 

'Coding test(Python3) > Programmers' 카테고리의 다른 글

[DAY-39] 가운데 글자 가져오기  (0) 2024.07.11
[level 2] 다리를 건너는 트럭  (0) 2024.07.11
[level 2] 기능개발  (1) 2024.07.09
[level 3] 아이템 줍기  (0) 2024.07.08
[level3] N으로 표현  (0) 2024.07.06