/ PROBLEMS

[Programmers] 프린터

Note : 이 글은 지극히 주관적인 생각을 토대로 작성된 글입니다. 혹시나 잘못된 부분이 있다면 메일 또는 코멘트를 통해 알려주시면 감사하겠습니다. 😄 제 메일은 About 탭에서 확인하실 수 있습니다. 📧

P.S : 이 페이지는 웹에 최적화 된 페이지입니다. 가급적 모바일이 아닌 웹에서 보시는 것을 추천드립니다.

문제 정보

  • 문제 설명

    • 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다.

    • 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.

      • 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.

      • 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.

      • 그렇지 않으면 J를 인쇄합니다.

    • 예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2라면 C D A B순으로 인쇄하게 됩니다.

    • 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서 C1번째로, A3번째로 인쇄됩니다.

    • 현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return하도록 solution함수를 작성해주세요.

  • 제한사항

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

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

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

  • 입출력 케이스

    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순으로 인쇄합니다.

소스코드

  • 문제 풀이 언어 : Java
import java.util.*;
import java.util.stream.IntStream;

class Solution {
    public int solution(int[] priorities, int location) {
        PriorityQueue priorityQueue = new PriorityQueue(Collections.reverseOrder());
        IntStream.rangeClosed(0, priorities.length - 1)
                    .forEach(i -> priorityQueue.add(priorities[i]));
        int count = 1;

        while (!priorityQueue.isEmpty()) {
            for (int i=0; i<priorities.length; i++) {
                if (priorities[i] == (int) priorityQueue.peek()) {
                    if (i == location)
                        return count;
                    priorityQueue.poll();
                    count++;
                }
            }
        }

        return count;
    }
}