일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 코딩테스트
- John Sonmez
- 프로그래머스
- 커리어
- 임시 변수
- 가독성
- 중첩
- deque
- 파이썬
- 힙
- 그리디
- 중간 변수
- 중첩문
- enumerate
- max-heap
- min heap
- 탈출 조건
- 스택/큐
- 매직 넘버
- 조합
- 함수
- 대소 비교
- ZIP
- 가이드
- permutations
- 부등호
- 2020 채용
- 함수화
- 변수명
- boolean
- Today
- Total
Better Code, Better Life
프린터 - 프로그래머스 - 파이썬 풀이 본문
문제 풀이
먼저 기존의 인덱스가 몇번째 순서로 프린트 되는지 알아내야 하기 때문에 기존 인덱스를 묶어 저장합니다.
파이썬 리스트는 첫번째 원소를 빼낼 때(pop) 비용이 많이 듭니다. 따라서 이를 queue 자료 구조인 collections 의 deque를 이용합니다.
아래 링크를 보면 deque의 시간복잡도를 알 수 있습니다.
그 다음부터는 출력물이 어떤 순서로 뽑히는지 알아내는 로직을 세웁니다.
- 프린터 출력물 상단부터 제일 우선순위가 높은지 확인합니다.
- max_priority = get_max_priority(indexed_priority_deque)
- 맞으면 출력순서 리스트(print_order_list)에 저장합니다.
- 아니면 출력물 하단에 삽입합니다.
마지막으로 목표 출력물인 location이 몇 번째에 위치하는지 확인합니다.
클린 코드 작성법
-
get_max_priority 함수를 통해 while문 내의 중첩을 줄일 수 있었습니다. 중첩의 깊이를 줄이면 가독성도 늘어납니다.
-
임시 변수를 잘 활용하면 가독성이 좋아집니다. 여러 번의 과정을 거쳐 한 번에 선언하는 것보다 중간 단계를 임시 변수에 선언하면 됩니다. 아래는 중간 단계의 임시 변수 목록입니다.
- print_length
- print_indexes
- zerobase_index = print_order_list.index(location)
-
부등호 이용 시, 작은 것이 왼쪽에 위치하는게 사고의 흐름에 자연스럽습니다.
- if max_priority <= priority:
-
변수의 이름도 코딩의 큰 비중을 차지합니다. 해당 데이터를 제일 잘 표현할 수 있는 변수명을 붙입니다.
해답 코드
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
'Coding Test > Programmers' 카테고리의 다른 글
쇠막대기 - 프로그래머스 - 파이썬 풀이 (0) | 2019.07.28 |
---|---|
탑 - 프로그래머스 - 파이썬 풀이 (0) | 2019.07.26 |
베스트앨범 - 프로그래머스 - 파이썬 풀이 (0) | 2019.07.22 |
위장 - 프로그래머스 - 파이썬 풀이 (0) | 2019.07.20 |
전화번호 목록 - 프로그래머스 - 파이썬 풀이 (0) | 2019.07.17 |