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

Jewon Joel Park·2022년 6월 13일
0

Programmers-solution

목록 보기
19/34

문제 링크


문제 설명

인쇄 우선순위와 내가 요청한 문서의 위치가 주어질 때, 우선순위 순서대로 출력했을 경우 내 문서가 몇번째로 인쇄되는지 반환하는 함수 작성

  • 인쇄 방식
  1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
  2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
  3. 그렇지 않으면 J를 인쇄합니다.

풀이 코드

  • 내 코드
def solution(priorities, location):
    answer = 0
    enum = [i for i in enumerate(priorities)]
    while True:
        if len(enum) > 1:
            j = enum.pop(0)
            jp = priorities.pop(0)
            if j[1] < max(priorities):
                enum.append(j)
                priorities.append(jp)
            else:
                answer += 1
                if j[0] == location:
                    break
        else:
            answer += 1
            break
    return answer
  • 다른 사람의 더 간단한 로직
def solution(priorities, location):
    priorities = [(v, idx) for idx, v in enumerate(priorities)]
    count = 0
    while True:
        if priorities[0][0] == max(priorities)[0]:
            count += 1
            if priorities[0][1] == location:
                break
            priorities.pop(0)
        else:
            priorities.append(priorities.pop(0))
    return count

코드 설명

  1. location을 활용하기 위해 주어진 배열 priorities를 enumerate화
  2. 무한 while Loop으로 아래와 같은 사이클 수행
    • enumpriorities에서 pop(0) 수행
    • 남아있는 priorities 개체 중 가장 큰 수(max)와 enum.pop(0)(index, priority)priority값을 비교하여, max 값이 더 클 경우 조건에 의해 목록 최 후순위로 append()
    • max 값이 더 작거나 같을 경우 인쇄 수행(카운트 +1)후, 해당 인덱스가 location과 일치할 때 break
  3. 2번을 수행하되, 주어진 인쇄 목록이 1개일 경우 pop()을 수행했을 때 properties 개체의 길이가 0이되므로 max 값이 존재하지 않아 런타임 오류 발생
  4. 따라서 while Loop 실행 최우선으로 길이를 비교하고, 주어진 properties 길이가 1일 경우 바로 인쇄를 수행하고 break

cf) 튜플에 max()가 적용된다는 걸 생각을 못해서 좀 더 수월하게 풀 수 있는 방법을 놓쳤음.

profile
10년을 돌고 돌아 마침내 제자리를 찾은 문과 출신 Python 개발자의 인생기록장

0개의 댓글