알고리즘/스택,큐

[프로그래머스] 프린터 - 파이썬(python)

아뵹젼 2022. 9. 2.

 

✅ 나의 풀이

def solution(priorities, location):
    waiting = [(i,j) for i,j in enumerate(priorities)]
    complete = []

    while waiting :
        if waiting[0][1] < max(waiting, key = lambda x:x[1])[1] : 
            waiting.append(waiting[0])
            waiting.pop(0)
        else :
            complete.append(waiting[0])
            waiting.pop(0)
    
    for num, i in enumerate(complete) :
        if i[0] == location :
            return num+1

[ (0,2), (1,1) , (2,3) , (3,2) ] 와 같이 (처음 시작할 때의 인덱스, 우선순위) 의 튜플 형태로 waiting(대기목록) 리스트에 저장하였다.

만약 대기목록의 맨 앞에 있는 튜플이 최대 우선순위가 아니라면?

대기목록의 맨 뒤로 보낸다.

->  waiting.append(waiting[0])
     waiting.pop(0)

 

최대 우선순위라면 ?

complete 리스트에 저장하고, waiting 대기목록리스트에서 제거한다.

-> complete.append(waiting[0])
    waiting.pop(0)

 

 

내 코드의 안좋은점  

1) 모든 문서를 출력한다. -> location 에 해당하는 문서가 인쇄되면 break 를 통해 반복문을 탈출해야 한다

2) 완성된 문서를 저장하는 리스트를 만들어서, 출력된 문서를 반복문으로 돌면서 location 에 해당하는 문서의 인덱스를 찾는 불필요한 과정이 포함되었다. -> 출력될 때마다 +1 을 하는 변수로 해결가능

 

 

이를 모두 보완하는 코드는 아래에 있다.

 

 

✅ 다른 풀이

def solution(priorities, location):
    q = [(i, p) for (i, p) in enumerate(priorities)]
    answer = 0
    while q:
        front = q.pop(0)
        if any( front[1] < doc[1] for doc in q ):
            q.append(front)
        else:
            answer += 1
            if front[0] == location:
                break

    return answer

내 코드보다 좋은 점

1) max대신 any 를 사용하여 더욱 직관적이다.

2) 만약 맨 앞에 있는 문서의 우선순위가 가장 높은 경우라면 바로 출력이 된다. -> 즉, 이때 complete 라는 불필요한 리스트에 이를 추가한 것이 아니라, 이 문서의 인덱스가 location 과 일치하다면 바로 반복문을 탈출한다.

또한 출력되는 문서의 갯수를 answer 로 표기하여, 해당 location 의 문서가 몇 번째로 출력되는지 바로 확인할 수 있다.

👏🏻👏🏻👏🏻👏🏻👏🏻👏🏻 

댓글