[프로그래머스] 프린터
https://programmers.co.kr/learn/courses/30/lessons/42587?language=java
코딩테스트 연습 - 프린터
일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린
programmers.co.kr
2021-07-28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.util.Collections;
import java.util.PriorityQueue;
class Solution {
public int solution(int[] priorities, int location) {
int answer = 0;
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
for(int p: priorities) pq.offer(p);
loop:while(!pq.isEmpty()) {
for(int i = 0; i < priorities.length; i++) {
if(pq.peek() == priorities[i]) {
pq.poll();
answer++;
if(i == location) break loop;
}
}
}
return answer;
}
}
|
cs |
#문제풀이
예제 2번을 기준으로 본다.
priorities [1, 1, 9, 1, 1, 1]
location 0
주어진 priorities 배열은 다음과 같다.
(line 7) 위 배열을 값이 큰 순서대로 (priority) queue에 넣어놓으면 아래와 같을 것 이다. priority queue에서 인덱스 값은 따로 관리하지 않고 값 자체만 관리를 하였다.
그래서 우리는 priority queue 안에 값이 있을 때까지 while문을 돌릴건데, 이 때 pq의 값과 함께 체크 해야할 것이 인덱스를 알 수 있는 priority 배열이다.
(line 13) 현재 pq의 값, 즉 제일 먼저 프린트 되어야 할 문서의 인덱스를 priorities 배열로 알 수 있다.
만약, 현재 pq에서 peek()을 했을 때 나오는 값이 priorities의 값과 같다면 해당 인덱스가 지금 프린트해야할 값과 같다는 의미이므로, pq에서 poll()을 해주면 된다.
좀 더 자세하게 보자면, pq.peek()값이 9일 때 priorities 배열을 앞에서부터 찾아간다. priorities 배열인덱스 0~1은 내가 찾고자 하는 값이 아니므로, 주어진 조건처럼 가장 뒤로 프린트 순서가 미뤄진다.
그래서 priorities 배열 인덱스 2 에서 내가 원하는 값을 찾으면 pq에서 poll()을 해버린다. 그리고, priorities 배열이 끝날 때까지 계속 탐색을 하면 다음과 같다.
(line 15) 그리고, pq.peek()값이 내가 찾고자 하는 priorities와 일치한다면 계속 프린트 문서가 늘어나는 것을 answer++ 해줘야한다.
(line 16) 목적은 location 위치의 문서가 몇 번째로 프린트 됐는지가 궁금한 것이므로, 인덱스 값이 location이랑 같을 때 answer값을 리턴해주면된다. lcoation 0의 문서는 4개의 문서가 프린트 된 후 다섯 번째에 프린트가 되는 것을 확인할 수 있다.