Algorithm/프로그래머스

[프로그래머스/Python] 프린터 - Level2

poppy 2021. 5. 22. 12:33
반응형

https://programmers.co.kr/learn/courses/30/lessons/42587?language=python3 

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

def solution(priorities, location):
    prList = [(p, i) for i, p in enumerate(priorities)] # 우선순위와 인덱스를 튜플로 묶어 저장
    que = [] # 프린트될 순서의 인덱스 리스트
    
    # 프린트될 순서 구하기
    while prList:
        pList = [p for p, i in prList]
        p = prList.pop(0)
        
        if p[0] >= max(pList): # 최대 우선순위 값의 인덱스를 que에 저장
            que.append(p[1])
        else: # 최대 우선순위가 아니라면 prList의 맨 뒤에 저장
            prList.append(p)
    
    return que.index(location) + 1

우선순위 정보와 그 우선순위의 인덱스 값이 필요하므로 두 개의 값을 튜플로 묶어 리스트로 prList에 저장합니다. while문을 통해 prList에 값이 없을 때까지 코드를 반복합니다. prList에서 우선순위로 높은 순서대로 값을 빼서 프린트 순서를 que에 저장할 것이므로 prList에서 우선순위값만 가져와 pList에 저장합니다. prList에 저장된 값이 계속 변하므로 pList도 계속 변하게 됩니다. prList에서 첫번째 값을 가져와 최대 우선순위와 같다면 que에 인덱스 정보를 저장하고 그렇지 않다면 대기목록의 맨 뒤로 보내주기 위해 prList의 맨 뒤에 저장합니다.

location의 프린트 순서를 리턴해야하므로 index()를 통해 que에서의 위치정보를 가져와 +1 하여 리턴해줍니다. ( +1 하는 이유는 순서가 1부터 시작이므로!)

 

- 배운 점 -

enumerate() - 반복문 사용시 몇 번째 반복문인지 알고 싶을 때 사용하는 함수입니다. 인덱스 번호와 리스트 값을 튜플 형태로 반환해줍니다. 다음 예시를 참고해주세요

t = [1, 5, 7, 33, 39, 52]
for p in enumerate(t):
    print(p)
    
# 출력
(0, 1)
(1, 5)
(2, 7)
(3, 33)
(4, 39)
(5, 52)

 

 

다른 사람들의 풀이를 보니 많은 공부의 필요성을 또 다시 느꼈습니다... 찾아보니 이 문제는 다양한 코드가 있는 것 같습니다. 

# deque 사용

from collections import deque
def solution(priorities, location):
    answer = 0
    
    d = deque([(v,i) for i,v in enumerate(priorities)])

    while len(d):
        item = d.popleft()
        if d and max(d)[0] > item[0]:
            d.append(item)
        else:
            answer += 1
            if item[1] == location:
                break
    return answer
def solution(p, l):
    ans = 0
    m = max(p)
    while True:
        v = p.pop(0)
        if m == v:
            ans += 1
            if l == 0:
                break
            else:
                l -= 1
            m = max(p)
        else:
            p.append(v)
            if l == 0:
                l = len(p)-1
            else:
                l -= 1
    return ans
반응형