알고리즘/프로그래머스
[프로그래머스] 프린터 -Java
dkwjdi
2021. 2. 22. 15:02
https://programmers.co.kr/learn/courses/30/lessons/42587
코딩테스트 연습 - 프린터
일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린
programmers.co.kr
import java.util.Collections;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
class Solution {
public int solution(int[] priorities, int location) {
int answer = 0;
Queue <Integer> priority = new LinkedList<>(); //중요도
PriorityQueue <Integer> sortPriority = new PriorityQueue<Integer>(Collections.reverseOrder());
Queue <Integer> index = new LinkedList<>(); //인덱스
for(int i=0; i<priorities.length; i++) {
index.offer(i);
priority.offer(priorities[i]);
sortPriority.offer(priorities[i]);
}
int cnt=0;
while(!priority.isEmpty()) {
int pri=priority.poll(); //프린터 하나 뽑기
int idx=index.poll();
if(pri==sortPriority.peek()) { //현재 뽑는게 가장 높은 우선순위를 가진다면
cnt++;
sortPriority.poll();
if(idx==location) { //찾으면
answer=cnt;
break;
}
}
else { //우선순위 더 높은게 있다면 다시 넣어주기
priority.offer(pri);
index.offer(idx);
}
}
return answer;
}
}
소요시간 : 15분
큐를 3개 사용했습니다.
1. 중요도를 저장할 큐
2. 중요도가 높은 순으로 저장되어 있는 우선순위 큐
3. 인덱스를 저장할 큐
로직을 살펴보면
1. 중요도, index를 저장하고 있는 큐에서 각각 하나씩 poll합니다.
2. 중요도 우선순위큐에서 peek을 합니다.
2-1. 만약 중요도와 우선순위큐에서 뽑은 중요도가 같다면 우선순위큐를 poll합니다.
그리고 프린터한 숫자를 1개 늘려줍니다.
만약 인덱스가 location과 같다면 answer에 cnt를 넣어주고 while문을 종료합니다.
2-2. 우선순위큐의 중요도가 더 높다면
중요도, index를 다시 각각의 큐에 offer해줍니다.