프린터

bird.j·2021년 6월 9일
0

프로그래머스

목록 보기
5/53

프로그래머스

  • 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.
  1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
  2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
  3. 그렇지 않으면 J를 인쇄합니다.
  • 현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.
  • 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
  • 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
  • location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.

입출력

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


접근 방식

프린터 순서를 알맞게 정렬한 다음에 0인덱스부터 location까지를 세려고 했는데 이렇게 하면 시간이 오래걸려 실패한다.

따라서 프린터 순서를 정렬하는 것에 초점을 두는게 아니고, location 즉 알아야하는 원소가 0번째에 오기까지 pop을 하고 카운트를 세는 방법을 써야한다.

  • 중요도가 같을 경우를 판별하기 인덱스를 함께 저장한다.
  • 첫번째 원소를 pop하여 printer에 있는 나머지 원소의 중요도와 비교하여 더 작은게 있다면 printer의 제일 뒤에 append하고 break한다.
  • 만약 없다면 그 원소의 인덱스와 location을 비교한다.
    location과 같다면 카운트를 리턴한다.


코드

def solution(priorities, location):
    printer = []
    
    for i, priority in enumerate(priorities):
        printer.append((priority, i))
    
    cnt = 0
    while True:
        top = printer.pop(0)
        flag = 0
        for p in printer:
            if top[0] < p[0]:
                flag += 1
                printer.append(top)
                break
                
        if flag == 0:
            cnt += 1
            if top[1] == location:
                return cnt

0개의 댓글