출처 : https://school.programmers.co.kr/learn/courses/30/lessons/42587
import java.util.*;
class Solution {
public int solution(int[] priorities, int location) {
int answer = 0;
Deque<List<Integer>> deq = new ArrayDeque<>();
for (int p = 0; p < priorities.length; p++) {
deq.add(new ArrayList<>(Arrays.asList(priorities[p], p)));
}
boolean b = true;
int count = 0;
while (!deq.isEmpty()) {
int max = findMax(deq);
while (deq.peek().get(0) != max) {
List<Integer> moving = deq.removeFirst(); //remove and add to the last
deq.addLast(moving);
}
List<Integer> tobePolled = deq.poll();
count++;
if (tobePolled.get(1) == location) {
answer = count;
break;
}
}
return answer;
}
static int findMax(Deque<List<Integer>> deq) {
Deque<List<Integer>> copied = new ArrayDeque<>(deq);
int max = Integer.MIN_VALUE;
while (!copied.isEmpty()) {
List<Integer> polled = copied.poll();
max = Math.max(polled.get(0), max);
}
return max;
}
}
1) deq라는 이름을 가진 deque를 만든 뒤, 우선순위 값 그 자체와 그에 해당하는 index를 arrayList에 넣어서 삽입한다.
2) findMax라는 함수에서 현재 deq에 들어있는 최댓값을 구한다.
3) main함수로 돌아와, deq에서 peek()를 하면서 max값과 같다면 poll()을, 같지 않다면 removeFirst()한 뒤, 다시 큐의 가장 마지막으로 addLast()한다.
4) 이를 deq가 isEmpty()할 때까지 반복하면서 count값을 한 개씩 증가시킨다.
5) 반복하는동안 poll()한 list의 1번 자리에 들어있는, 즉 index가 주어진 location과 같다면 멈춘다.