1개 이상 100개 이하의 문서는 각각 1부터 9까지의 중요도를 가진다.
위 문서들을 다음 조건으로 프린트를 하는 프린터가 있다.
이때, 입력하는 문서의 배열 priorities
에서
index가 location
인 요소는 몇 번째로 출력되는지
반환하는 Solution을 작성하시오.
Test Case
priorities | location | return |
---|---|---|
[2, 1, 3, 2] | 2 | 1 |
[1, 1, 9, 1, 1, 1] | 0 | 5 |
[2, 5, 7, 3, 5, 7, 8, 4, 1] | 5 | 3 |
입력되는 배열을 index 순으로 queue에 담고,
프린트가 진행되는 과정을 코드로 변경해보았다.
인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
-> 저장한 queue를 하나씩 꺼낸다.
나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
그렇지 않으면 J를 인쇄합니다.
-> queue안에서 꺼낸 문서(Doc)가 현재 가장 높은 우선 순위인지 체크 후,
출력 또는 뒤로 배치하며 cnt++.
import java.util.*;
public class Num42587 {
public int solution(int[] priorities, int location) {
int cnt = 0;
int prLen = priorities.length;
Queue<Doc> que = new LinkedList<>();
for (int i = 0; i < prLen; i++) {
if (i == location) {
que.add(new Doc(priorities[i], true));
}else {
que.add(new Doc(priorities[i], false));
}
}
Comparator<Doc> comparator = Comparator.comparingInt(Doc::getPriority);
while (true) {
Doc max = que.stream().max(comparator).get();
Doc doc = que.poll();
if(doc.priority == max.priority){
cnt++;
if(doc.pick) break;
}
else que.add(doc);
}
return cnt;
}
private class Doc {
int priority;
boolean pick;
public Doc(int priority, boolean pick) {
this.priority = priority;
this.pick = pick;
}
public int getPriority() {
return priority;
}
}
}