[python] 큐_프린터 복습

EunBi Na·2022년 6월 23일
0
def solution(priorities, location):
    answer = 0
    cnt = 0
    # 중요도가 높은 문서 먼저 인쇄
    while len(priorities) > 0:
        for i in priorities:
            if priorities[0] > priorities[i]:
                priorities.pop(0)
                cnt += 1
            else:
                priorities[0], priorities[-1] = priorities[-1], priorities[0] 
                #list[-1]은 리스트에서 마지막의 값
        
        for i in priorities:
            if location = priorities[i]: #?
                answer.append(i)
                cnt += 1
    
    return answer

효율성 풀이

def solution(priorities, location):
    answer = 0

    array1 = [c for c in range(len(priorities))] # index 위치 저장 
    array2 = priorities.copy() # 값 저장 (출력되는 값)

    i = 0
    while True:
        if array2[i] < max(array2[i+1:]):
            array1.append(array1.pop(i))
            array2.append(array2.pop(i))
        else:
            i += 1

        if array2 == sorted(array2, reverse=True):
            break

    return array1.index(location) + 1
def solution(priorities, location):
    answer = 0
 
    while len(priorities) > 0:
        if priorities[0] == max(priorities):  # 우선순위 확인
            # 맨 앞 문서 인쇄
            priorities.pop(0)
            answer += 1
            if location == 0:  # 요청한 문서이면 반복문 종료
                break
        else:
            # 맨 앞 문서를 대기 목록의 가장 마지막에 추가
            priorities.append(priorities.pop(0))
        location = location - 1 if location > 0 else len(priorities) - 1  # 요청 문서 위치 변경
    return answer

deque를 활용하면 약 절반정도 빠름

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

배운것

enumerate() 함수

그럼 어떻게 해야 좀 더 파이썬답게 인덱스(index)와 원소를 동시에 접근하면서 루프를 돌릴 수가 있을까?
바로 파이썬의 내장 함수인 enumerate()를 이용하면 되는데요. for 문의 in 뒷 부분을 enumerate() 함수로 한 번 감싸주기만 하면 됩니다.

>>> for entry in enumerate(['A', 'B', 'C']):
...     print(entry)
...
(0, 'A')
(1, 'B')
(2, 'C')

enumerate() 함수는 기본적으로 인덱스와 원소로 이루어진 터플(tuple)을 만들어줍니다. 따라서 인덱스와 원소를 각각 다른 변수에 할당하고 싶다면 인자 풀기(unpacking)를 해줘야 합니다.

profile
This is a velog that freely records the process I learn.

0개의 댓글