[Programmers] 프린터
Note : 이 글은 지극히 주관적인 생각을 토대로 작성된 글입니다. 혹시나 잘못된 부분이 있다면 메일 또는 코멘트를 통해 알려주시면 감사하겠습니다. 😄 제 메일은 About 탭에서 확인하실 수 있습니다. 📧
P.S : 이 페이지는 웹에 최적화 된 페이지입니다. 가급적 모바일이 아닌 웹에서 보시는 것을 추천드립니다.
문제 정보
-
문제 설명
-
일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다.
-
이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.
-
인쇄 대기목록의 가장 앞에 있는 문서(
J
)를 대기목록에서 꺼냅니다. -
나머지 인쇄 대기목록에서
J
보다 중요도가 높은 문서가 한 개라도 존재하면J
를 대기목록의 가장 마지막에 넣습니다. -
그렇지 않으면
J
를 인쇄합니다.
-
-
예를 들어,
4
개의 문서(A, B, C, D
)가 순서대로 인쇄 대기목록에 있고 중요도가2 1 3 2
라면C D A B
순으로 인쇄하게 됩니다. -
내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서
C
는1
번째로,A
는3
번째로 인쇄됩니다. -
현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열
priorities
와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는location
이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지return
하도록solution
함수를 작성해주세요.
-
-
제한사항
-
현재 대기목록에는
1
개 이상100
개 이하의 문서가 있습니다. -
인쇄 작업의 중요도는
1~9
로 표현하며 숫자가 클수록 중요하다는 뜻입니다. -
location
은0
이상 (현재 대기목록에 있는 작업 수 -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;
}
}