프로그래머스 Lv.2 - 프린터

Tabber·2021년 6월 10일
0

알고리즘

목록 보기
2/4

문제 설명
일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.

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

사실 위 문장이 난 이해가 잘 안갔었다. 근데 나만 이해를 못했던건 또 아니었다.

이해를 못하는 나같은 사람들을 위해 어느분이 자세히 설명을 해주셨다.

아래의 글을 천천히 읽어보길 바란다.

  1. 최초의 인쇄 대기목록입니다.
    -> (A,2) (B,1) (C,3) (D,2)
    -> 인쇄완료 : 없음
  1. 가장 앞에 있는 문서(A,2)를 꺼내 조건을 적용합니다
    나머지 인쇄 대기목록에서 중요도가 더 높은 문서(C,3)가 존재하므로 맨 뒤로 보냅니다.
    -> (B,1) (C,3) (D,2) (A,2)
    -> 인쇄완료 : 없음
  1. 가장 앞에 있는 문서(B,1)를 꺼내 조건을 적용합니다
    나머지 인쇄 대기목록에서 중요도가 더 높은 문서(C,3)가 존재하므로 맨 뒤로 보냅니다.
    -> (C,3) (D,2) (A,2) (B,1)
    -> 인쇄완료 : 없음
  1. 가장 앞에 있는 문서(C,3)를 꺼내 조건을 적용합니다
    나머지 인쇄 대기목록에서 중요도가 더 높은 문서가 없으므로 인쇄합니다.
    -> (D,2) (A,2) (B,1)
    -> 인쇄완료 : (C,3)
  1. 가장 앞에 있는 문서(D,2)를 꺼내 조건을 적용합니다
    나머지 인쇄 대기목록에서 중요도가 더 높은 문서가 없으므로 인쇄합니다.
    -> (A,2) (B,1)
    -> 인쇄완료 : (C,3) (D,2)
  1. 가장 앞에 있는 문서(A,2)를 꺼내 조건을 적용합니다
    나머지 인쇄 대기목록에서 중요도가 더 높은 문서가 없으므로 인쇄합니다.
    -> (B,1)
    -> 인쇄완료 : (C,3) (D,2) (A,2)
  1. 가장 앞에 있는 문서(B,1)를 꺼내 조건을 적용합니다
    나머지 인쇄 대기목록에서 중요도가 더 높은 문서가 없으므로 인쇄합니다.
    -> 인쇄완료 : (C,3) (D,2) (A,2) (B,1)
  1. 인쇄 순서는 C D A B 가 됩니다.
    (프로그래머스 Typebi님 댓글)

이렇게 순서가 돌아가면서 원하는 location에 도달할 경우에 순서를 리턴하는 방식으로 코드를 짜야 한다.

처음에 순서를 지키긴 했는데 순서를 어떻게 출력해야 하는지를 잘 몰라서 고생좀 했다.
그리고 여러 방면으로 지우고, 쓰고를 반복하다 보니 답이 도출되었다.

풀이 방법

  1. 먼저 프린터의 출력할것들의 우선순위가 담겨있는 리스트와, 그 순서가 기록된 카운트를 같이 묶어서 새로운 리스트에 추가시켜준다. 이래야지 나중에 문제에서 원하는 인덱스가 어디 있는지 찾을 수 있다.
  2. 위에서 말했듯, 앞에서부터 하나씩 꺼내고, 꺼낸 리스트의 우선순위 수가 최대값과 다를 경우 꺼낸 수를 제일 뒤로 보내준다.
  3. 만일 최대값과 같을경우 그 리스트의 인덱스가 질문의 로케이션과 같은지 체크해주고, 다를 시 순서만 증가시키고 출력했다는 표시로 그 리스트를 pop()해준다.
  4. 만일 질문의 로케이션과 같을경우엔 지금까지 진행되었던 순서를 리턴해준다.

리스트로도 큐의 기능을 사용할수 있어서 딱히 import로 불러오지 않았다.

Tip. 리스트의 pop()은 매개변수로 원하는 인덱스의 수를 넣어줄 경우 그 인덱스가 삭제된다. 이거 개꿀이다.

해답 코드

def solution(priorities, location):
    d = []
    cnt = 0 # 각 프린터할 것들의 인덱스
    tmp = 0 # 최댓값 변수
    for i in priorities:
        d.append((cnt, i))
        cnt += 1
    
    result = 0 # 출력된 순서
    while len(d) != 0: # d의 원소들이 없어질때까지 돌아감
        tmp = 0
        for i in d:
            if tmp < i[1]:
                tmp = i[1]
        check = d[0]
        if check[1] < tmp:
            d.pop(0)
            d.append(check)
        else:
            result += 1
            if check[0] == location: # 원했던 로케이션에 맞는 인덱스가 출력 될 시 순서 리턴
                return result
            d.pop(0) # 그게 아니면 순서 증가시키고 pop()
profile
iOS 정복중인 Tabber 입니다.

0개의 댓글