본문 바로가기
Algorithm

[프로그래머스] 프린터 파이썬

by YGSEO 2021. 3. 3.
728x90

다른 사람의 풀이

def solution(priorities, location):
  answer = 0
  from collections import deque

  d = deque([(v,i) for i,v in enumerate(priorities)])

  while len(d):
      item = d.popleft()
      if d and max(d)[0] > item[0]:
          d.append(item)
      else:
          answer += 1
          if item[1] == location:
              break
  return answer

 

  • index와 value 두 가지가 동시에 필요할 때는 tuple를 활용하기
  • stack 문제의 경우 deque를 써서 양방향 queue를 사용하면 편하다

enumerate 함수를 사용해서 (index, value) 쌍의 tuple를 만들어 주는데 deque에 넣을때는 (value, index) 순으로 넣어준다. 순서는 딱히 상관은 없지만 뒤에 쓸 max에서 번거롭지 않게 하기 위해 (value, index)로 넣어주자.

 

deque를 만들고 나서

pop and append 작업을 계속 수행할텐데

while 문은 d가 존재하는 경우를 조건으로 달아준다.

 

if d and max(d)[0] > item[0]:

이 줄에서 d의 존재를 확인하려는 이유는 그 윗줄에서 pop을 했기 때문에 만약 len(d)=1일 경우 에러가 발생하기 때문이다.

 

max(d)를 하게 되면 d의 tuple 구조가 (value, index)로 되어있기 때문에 별다른 max의 default key가 없다면 tuple 순서대로 value를 기준으로 max값을 찾고 해당 tuple을 return 하게 된다.

그리고 비교 기준이 value이기 때문에 max(d)의 0번째 원소와 item의 0번째 원소를 비교한다.

 

else 문에서는 우선순위가 제일 높지 않은 경우,

answer의 값을 1씩 증가시키면서 item의 index와 location의 값이 일치하는 경우,

answer의 값을 return 하면 된다.(위치만 알면 되기 때문에)

(printed list를 따로 만들어서 index를 찾고 다시 index+1을 더해서 zero index을 반영하기 보다는 이런 방식이 훨씬 효율적일 것이다.)

 

 

 

728x90

댓글