문제 설명
일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.
- 인쇄 대기목록의 가장 앞에 있는 문서(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
함수를 작성해주세요.
제한사항
입출력 예
나의 코드
🍎발상🍎
- 주어진 우선순위를 내림차순으로 정렬하며, 큐 내부에서 우선순위의 최댓값을 만날때까지 remove -> add를 반복한다.
- 최댓값을 가진 원소를 만나면 remove하고 출력되는 문서를 저장하는 배열에 담는다. 이후, 우선순위를 내림차순으로 정렬한 List에서 해당 값을 삭제.
- 위 과정을 반복한다.
코드를 천천히 보면 어떤 방식으로 구현했는지 알 수 있을 것이다!
import java.util.*;
class Order {
int priority=0;
int key=0; //내가 찾고자하는 것은 key값이 1이 된다.
Order(int p, int k){
priority=p;
key=k;
}
}
class Solution {
Queue <Order> q = new LinkedList<>();
ArrayList<Integer> prior = new ArrayList<>();
ArrayList<Order> result = new ArrayList<>();
public int solution(int[] priorities, int location) {
int answer = 0;
for(int i=0;i<priorities.length;i++){
prior.add(priorities[i]);
}
Collections.sort(prior, Collections.reverseOrder());
for(int i=0;i<prior.size();i++){
System.out.println(prior.get(i));
}
for(int i=0;i<priorities.length;i++){
if(i==location){
q.add(new Order(priorities[i], 1));
}
else{
q.add(new Order(priorities[i], 0));
}
}
//prior안에 첫 번째 원소를 만날 때 까지 계속 remove하고 맨 뒤로 add하는 과정을 반복한다.
while(q.size()!=0){
Order a = q.peek();
if(a.priority==prior.get(0)){
q.remove();
prior.remove(0);
result.add(a);
}
else{
Order temp = q.remove();
q.add(temp);
}
}
for(int i=0;i<result.size();i++){
Order tmp = result.get(i);
if(tmp.key==1){
answer = i + 1;
break;
}
}
return answer;
}
}