[프로그래머스 / lv.2] 프린트


날짜: 2021년 12월 21일
소요 시간: 46분 21초
카테고리: 스택, 큐
태그: 레벨2, 파이썬

프로그래머스 - 프린트

입출력 예시

prioritieslocationreturn
[2, 1, 3, 2]21
[1, 1, 9, 1, 1, 1]05

내가 적은 코드

def solution(priorities, location):
    answer = 1
    doc_loc = list()
    # 문서 인덱스를 담은 배열 생성
    for idx, p in enumerate(priorities):
        doc_loc.append(idx)

    while priorities:
        if priorities[0] == max(priorities):
            if doc_loc[0] == location:
                break
            else:
                priorities.pop(0)
                doc_loc.pop(0)
                answer += 1
        elif priorities[0] != max(priorities):
            priorities.append(priorities.pop(0))
            doc_loc.append(doc_loc.pop(0))

    return answer

풀이 과정

location을 확인 할 문서 인덱스를 담은 배열을 생성 한 뒤

priorities의 원소가 우선 순위가 가장 높은지를 확인하기 위해 max() 함수를 통한 비교로 우선순위가 가장 높은 지 반복하여 확인

  • 만약 우선순위가 가장 높다면
    • doc_loc 배열을 확인해서 location과 일치한지 확인
      • 일치한다면 반복문을 종료
      • 일치하지 않는다면 prioritiesdoc_loc의 0번째 인덱스의 값을 pop() 한 후 answer에 1을 더함
    • doc_loc 배열을 확인해서 location과 일치하지 않는다면
      • prioritiesdoc_loc의 0번째 인덱스의 값을 pop() 한 후 append() 하여 가장 뒤에 붙여줌
        모든 과정이 반복되어 끝나거나 중간에 location과 일치한 인덱스의 값이 나와 break 된다면 answer 반환

베스트 코드

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

리뷰

  • 나는 따로 doc_loc 배열을 만들어 주었는데 베스트 코드에서는 튜플로 만들어서 메모리를 아꼈다.
  • 저 중에 하나라도 있으면 true로 처리되는 any() 함수를 처음 알게 되었다.




© 2021. by hminkim