티스토리 뷰

728x90

[Python]프로그래머스 문제풀이 - 프린터






서문




오늘은 프로그래머스 사이트 / 코딩테스트 / 스택,큐 부분 마지막 문제풀이를 하겠습니다. 문제를 살펴보겠습니다. 😉




코드의 전개 논리가 궁금하시다면, 밑의 사이트에 들어가서 코드를 작성하여 visualize해주시면 코드가 어떤 식으로 흘러가는지 눈으로 파악하실 수 있습니다!



출처: http://pythontutor.com/




1. 문제 설명


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



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

예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다.
내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서 C는 1번째로, A는 3번째로 인쇄됩니다.
현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.




2. 제한사항


  • 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.

  • 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.

  • location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.



3. 입출력 예 설명


priorities location return
[2, 1, 3, 2] 2 1
[1, 1, 9, 1, 1, 1] 0 5


#1


문제에 나온 예와 같습니다.


#2


6개의 문서(A, B, C, D, E, F)가 인쇄 대기목록에 있고 중요도가 1 1 9 1 1 1 이므로 C D E F A B 순으로 인쇄합니다.







본문




요약



  • 문서의 우선순위와 원하는 문서의 위치를 나타내는 index값인 location이 주어지고 문제와 같이 변환 후 원하는 문서의 index를 return해야 한다.

  • 우선순위는 클수록 중요한 것이고 location은 0부터 시작한다.

  • 문서를 처음부터 뽑는데 만약 priorities에 뽑은 문서의 우선순위보다 큰 문서가 하나라도 있으면 뽑은 문서는 뒤로 보낸다.


문제풀이



코드



def solution(priorities, location):
    idx_value_list = []
    final = []

    for idx, i in enumerate(priorities):
        idx_value_list.append([i,idx])

    flag = idx_value_list[location]
    max_v = max(idx_value_list)


    while idx_value_list:
        idx = 0

        if max_v[0] > idx_value_list[idx][0]:
            idx_value_list.append(idx_value_list.pop(idx))
            idx += 1

        elif max_v[0] == idx_value_list[idx][0]:
            final.append(idx_value_list.pop(0))
            if idx_value_list:
                max_v = max(idx_value_list)
                idx = 0

    answer = final.index(flag)+1

    answer
    return answer


결과



채점 결과
정확성: 100.0
합계: 100.0 / 100.0



Detail Code Review


  • 우선 index와 value가 중요하기 때문에 enumerate() 사용하여 priorities의 index와 value값을 뽑아서 새로운 리스트(idx_value_list)에 담는다.

  • 내가 원하는 문서를 찾아야 하기 때문에 flag에 내가 원하는 문서의 정보를 담는다.

  • idx_value_list에 담긴 정보 중 가장 큰 값을 찾아서 max_v에 넣는다. 왜냐하면 가장 큰 값이 존재한다는 것은 뽑은 문서의 우선순위보다 높은 값이 존재하는 것이고, 그럼 뽑은 문서를 뒤로 보내주어야 하기 때문이다.

  • final이라는 리스트에는 idx_value_list를 정렬하면서 확정된 값을 뽑아서 넣어주기 위함이다.


  • 확정된 값은 마지막에 다 빠지기 때문에 idx_value_list는 종래에는 빈 리스트가 될 것이다. 그래서 while 문의 조건으로 idx_value_list를 넣었다.


  • 뽑은 우선순위와 max_v값을 비교하면서 max_v보다 작으면 다시 idx_value_list 뒤에 뽑은 요소를 붙인다.

  • 그러다가 만약에 max_v값이 idx_value_list의 첫 번째 요소와 같다면 그 요소는 확정된 우선순위이기 때문에 final에 담아준다. 이때 idx_value_list가 남아있다면, max_v값을 빼주고 남은 idx_value_list의 최대 값으로 다시 초기화 시켜주고, idx도 초기화 시켜준다.

  • 이 작업을 반복하면 final에 확정된 우선순위 순으로 다 들어가게 된다. 이때 flag에 담긴 정보를 이용하여 우리가 원하는 문서의 위치를 찾아내 answer에 담는다. 이때 +1을 해주는 이유는 return 값은 index값이 아니라 1부터 시작하는 값이기 때문이다.




혹시 문제가 있는 부분이 있으시면 말씀해주세요.🤗




댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함