[Programmers / Python / 스택 큐] - 프린터

Young·2021년 5월 24일
0

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

  1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
  2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
  3. 그렇지 않으면 J를 인쇄합니다.

priorities가 pop(0) 되더라도 초기의 index인 location를 보관할 수 있는 방법에 대해 고민을 했다.
처음에는 list를 따로 만들어서 관리하려 했었는데 이 경우 priorities의 변화에 맞춰 location list도 같이 변경해줘야 한다는 번거로움이 있었다.

그래서 list(enumerate(priorities))를 통해 stack 리스트에 tuple 형식으로 (location:priority) 이렇게 넣어주었고 priorities은 원본으로 유지하고 stack을 변형하는 방식으로 코드를 작성하였다.

나의 풀이

def solution(priorities, location):
    answer = 0

    stack = list(enumerate(priorities))

    while stack:
        for i in range(len(stack)):
            if stack[i][1] == max(list(map(lambda x:x[1], stack))):
                stack = stack[i:] + stack[:i]
                answer += 1
                
                if stack[0][0] == location:
                    return answer
            
                stack.pop(0)
                break
    

코드 설명

  1. enumerate를 통해 priorities 각 원소를 stack 에 (location : priority) 튜플 형식으로
stack = list(enumerate(priorities))
  1. stack의 원소가 존재하는 동안 while문을 실행
  • for문을 돌면서 각 원소의 priority가 현재 남아있는 priority 의 최댓값인지 확인
  • 최댓값 priority를 갖을 때 stack 원소를 기준으로 슬라이스해서 stack 변경
    stack = stack[i:] + stack[:i]
  • answer += 1 해준 후 만약 해당 원소의 location이 요청한 문서라면 return answer 해서 함수 종료
  • 해당 원소의 location이 요청한 문서가 아니라면 stack.pop(0) 해주고 break문을 통해 for문을 빠져나간 뒤 다시 while문 실행
        for i in range(len(stack)):
            if stack[i][1] == max(list(map(lambda x:x[1], stack))):
                stack = stack[i:] + stack[:i]
                answer += 1
                
                if stack[0][0] == location:
                    return answer
                
                stack.pop(0)
                break
profile
👩🏻‍💻

0개의 댓글

관련 채용 정보