[코드리뷰]프로그래머스_프린터
1. 문제
programmers.co.kr/learn/courses/30/lessons/42587
코딩테스트 연습 - 프린터
일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린��
programmers.co.kr
2. 소스코드-1 ( Python3 )
def solution(priorities, location): queue = [(i,p) for i,p in enumerate(priorities)] answer = 0 while True: cur = queue.pop(0) if any(cur[1] < q[1] for q in queue): queue.append(cur) else: answer += 1 if cur[0] == location: return answer |
소스코드-2 ( Python3 )
def solution(priorities, location): answer = 0 search, c = sorted(priorities, reverse=True), 0 while True: for i, priority in enumerate(priorities): s = search[c] if priority == s: c += 1 answer += 1 if i == location: break else: continue break return answer |
3. 공부
1) pair : (a, b)
2) enumerate
예제 코드 | 결과 화면 |
list = ['a', 'b', 'c', 'd', 'e'] for element in enumerate(list): print(element) print() for index, element in enumerate(list): print (index, element) print() start = 10 for index, element in enumerate(list, start): print(index, element) |
![]() |
3) any함수 : iterable자료구조의 원소 중 하나의 원소라도 0이 아니면 true를 리턴하는 함수. 비어있거나 전부 0이어야 false를 리턴한다.
예제 코드 | 결과 화면 |
# ex1 list = ['a', 'b', 'c', 'd', 'e'] x = any(list) print(x) print()
# ex2 list = [0, 0, 0, 0, 0] x = any(list) print(x) print()
# ex3 (프린터 문제 소스코드 이용) priorities = [1, 1, 9, 1, 1, 1] queue = [(i,p) for i,p in enumerate(priorities)] cur = queue.pop(0) if any(cur[1] < q[1] for q in queue): print("현재 원소가 최고 우선순위가 아님") else: print("현재 원소가 최고 우선순위가 맞음") print() |
![]() |
4) 정렬하는 방법
(1) list.sort() 메소드
stable sort이다. 같은 key값을 가진 원소가 여러 개일 때, 그 원소들끼리의 순서가 유지되는 정렬이다.
in-place sort를 한다. 정렬된 리스트를 return하지 않고 원본 리스트를 수정한다. 따라서 추가공간이 필요하지 않기 때문에 크기가 큰 sequence를 정렬할 때 좋다.
만약 원본 리스트가 필요하지 않다면, 아래 sorted()함수보다 약간 더 효율적이다.
(2) sorted() 함수
원본 리스트가 필요한 경우에 사용하면 좋다. 정렬된 리스트를 리턴하기 때문.
4. 고찰
1) 소스코드-1 알고리즘 해석
queue에 index와 priority의 pair를 만들었다. answer는 프린트한 문서 개수를 세는 변수. while loop를 돌리면서 현재 queue의 맨 앞의 원소를 pop한다. 현재 원소의 priority보다 queue안의 다른 원소의 priority값이 높은 경우가 있는지 확인해서 있으면 -> queue의 맨 뒤에 현재 원소를 다시 추가한다. 없으면 -> 프린트한다. 현재 문서의 index가 location과 같은지 확인하여 같다면 answer를 리턴한다. |
2) 소스코드-2 알고리즘 해석
마찬가지로 answer는 프린트한 문서 개수를 세는 변수. priorities 리스트를 정렬하여 search에 저장하였고, c에 0을 저장한다. (c번째 프린트=c번째 높은 우선순위를 의미) while loop를 돌리면서 for loop를 돌리면서 i는 index, priority는 우선순위 s는 c번째 프린트할 우선순위 값을 저장. 현재 priority가 s와 같으면 (즉, 현재 문서의 우선순위 == 현재 프린트할 우선순위) -> 프린트한다. c와 answer 값을 +1하고 현재 문서의 index가 location과 같은지 확인하여 같다면 answer를 리턴한다. 아니면 -> continue ## 내 생각) else: continue를 한 칸 앞으로 잘못 쓴 듯 하다. 원래는 if priority==s:에 대응하는 else인 것 같다. else문이 없어도 코드가 돌아가기 때문에 문제가 되지 않은 것 같다. |