포르그래머스 Lv2 프로세스

2024. 7. 8. 14:51알고리즘문제 풀이/프로그래머스

문제링크

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

 

풀이

큐를 이용한 문제이다.

 

큐를 이용하기 위해

우선 collection 중 deque를 import한다.

from collections import deque

 

우선순위 큐를 구현하기 위해

현재 큐에서의 순서와 우선순위를 보관한 리스트(pList)를 만든다.

그리고 이 리스트을 deque로 만들어 my_queue에 보관한다.

    pList = []
    for i, priority in enumerate(priorities):
        pList.append([i, priority])
        
    my_queue = deque(pList)

 

 

운영체제는 다음의 규칙에 따라 진행한다.

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

 

 

    # 이미 실행한 프로세스를 담는 array
    arr = []

    while len(my_queue) != 0:
    	# 1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
        popped_element = my_queue.popleft()
        isMore = True
        
        # 2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 
        #    방금 꺼낸 프로세스를 다시 큐에 넣습니다.
        for item in my_queue:
            if popped_element[1] < item[1]:
                isMore = False
                my_queue.append(popped_element)
                break
        
        # 3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
        if isMore:
            # 3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.
            arr.append(popped_element)

 

location: 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 매개변수

해당 프로세스가 몇 번째로 실행되는지 return

    cnt = 0
    for i, priority in arr:
        cnt += 1
        if location == i:
            return cnt

 

 

전체 풀이

from collections import deque

def solution(priorities, location):
    pList = []
    for i, priority in enumerate(priorities):
        pList.append([i, priority])
        
    my_queue = deque(pList)
    
    arr = []
    
    while len(my_queue) != 0:
        popped_element = my_queue.popleft()
        isMore = True
        
        for item in my_queue:
            if popped_element[1] < item[1]:
                isMore = False
                my_queue.append(popped_element)
                break
        
        if isMore:
            arr.append(popped_element)
    
    cnt = 0
    for i, priority in arr:
        cnt += 1
        if location == i:
            return cnt