Better Code, Better Life

프린터 - 프로그래머스 - 파이썬 풀이 본문

Coding Test/Programmers

프린터 - 프로그래머스 - 파이썬 풀이

심재훈 2019. 7. 24. 17:00

문제 풀이

먼저 기존의 인덱스가 몇번째 순서로 프린트 되는지 알아내야 하기 때문에 기존 인덱스를 묶어 저장합니다.

파이썬 리스트는 첫번째 원소를 빼낼 때(pop) 비용이 많이 듭니다. 따라서 이를 queue 자료 구조인 collections 의 deque를 이용합니다.

아래 링크를 보면 deque의 시간복잡도를 알 수 있습니다.

 

( https://wiki.python.org/moin/TimeComplexity )

 

그 다음부터는 출력물이 어떤 순서로 뽑히는지 알아내는 로직을 세웁니다.

  1. 프린터 출력물 상단부터 제일 우선순위가 높은지 확인합니다.
    1. max_priority = get_max_priority(indexed_priority_deque)
  2. 맞으면 출력순서 리스트(print_order_list)에 저장합니다.
  3. 아니면 출력물 하단에 삽입합니다.

마지막으로 목표 출력물인 location이 몇 번째에 위치하는지 확인합니다.

클린 코드 작성법

  1. get_max_priority 함수를 통해 while문 내의 중첩을 줄일 수 있었습니다. 중첩의 깊이를 줄이면 가독성도 늘어납니다.

  2. 임시 변수를 잘 활용하면 가독성이 좋아집니다. 여러 번의 과정을 거쳐 한 번에 선언하는 것보다 중간 단계를 임시 변수에 선언하면 됩니다. 아래는 중간 단계의 임시 변수 목록입니다.

    1. print_length
    2. print_indexes
    3. zerobase_index = print_order_list.index(location)
  3. 부등호 이용 시, 작은 것이 왼쪽에 위치하는게 사고의 흐름에 자연스럽습니다.

    1. if max_priority <= priority:
  4. 변수의 이름도 코딩의 큰 비중을 차지합니다. 해당 데이터를 제일 잘 표현할 수 있는 변수명을 붙입니다.

해답 코드

from collections import deque

def get_max_priority(indexed_priority_deque):
    if indexed_priority_deque:
        max_element = max(indexed_priority_deque, key=lambda x: x[0])
        max_priority = max_element[0]
    else:
        max_priority = 0
    return max_priority

def get_print_order_list(priorities):
    print_length = len(priorities)
    print_indexes = list(range(print_length))
    print_order_list = []
    indexed_priority_deque = deque(zip(priorities, print_indexes))
    while indexed_priority_deque:
        priority, index = indexed_priority_deque.popleft()
        max_priority = get_max_priority(indexed_priority_deque)
        if max_priority <= priority:
            print_order_list.append(index)
        else:
            indexed_priority_deque.append((priority, index))
    return print_order_list

def solution(priorities, location):
    print_order_list = get_print_order_list(priorities)
    zerobase_index = print_order_list.index(location)
    answer = zerobase_index + 1
    return answer

도움이 됐다면 공감버튼을 눌러주세요! 질문이 있다면 댓글 달아주세요!

 

문제 링크

 

코딩테스트 연습 - 프린터 | 프로그래머스

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다. 1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다. 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에

programmers.co.kr

 

Comments