본문 바로가기

알고리즘 코드리뷰

2. 프로그래머스_프린터

def solution(priorities, location):
    answer = 0
    queue = [(i, p) for i, p in enumerate(priorities)]

    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

역시 마찬가지로 내가 궁금한것들 위주로 리뷰를 진행해보겠다.

또한, 파이썬의 함수와 더불어 친숙해지기까지 시간복잡도, 공간복잡도와 같은 항목에 대해서 세세한 리뷰는 자재하려고 한다.

 

1. enumerate?

2. q[1] for q i queue?

 

1.  내장함수 enumerate

일단 기본적으로 파이썬에서 for문을 돌리는 방식에 대해서 알아보고자 한다.

>>> for letter in ['A', 'B', 'C']:
...     print(letter)
...
A
B
C

파이썬에서는 for 루프는 기본적으로 for <원소> in <목록>: 형태로 작성이 되는데요. 여기서 <목록> 부분에는 리스트(list), 터플(tuple), 문자열(string), 반복자(iterator), 제너레이터(generator) 등 순회가 가능한 왠만한 모든 데이터 타입을 사용할 수 있습니다. <원소> 부분은 흔히 순회 변수(loop variable)라고 하는데, <목록> 부분에 넘긴 객체가 담고 있는 원소들이 루프가 도는 동안 하나씩 차례로 할당됩니다.

 

여기서 원소뿐만 아니라 index도 출력하고 싶을때 사용하는것이 enumerate 내장함수이다.

위의 코드에서는

queue = [(i, p) for i, p in enumerate(priorities)]

와 같이 원소값과 내장값에 동시에 접근하면서 for loop를 돌릴수 있게 해준다.

 

2.  any 함수

자 any 함수의 내부 구조를 살펴보자.

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

iterable자료형을 받고 내부 element를 비교하면 true, fasle를 반환한다.

위의 코드를 살펴보자.

if any(cur[1] < q[1] for q in queue):

queue list에서 값을 꺼내온후, q[1]에 해당되는 값과 cur[1]에 해당되는 값을 비교하여 하나라도 맞을시 return을 반환한다.