import java.util.*;
class Solution {
public int solution(int[] priorities, int location) {
int answer = 0;
Queue<int[]> q = new LinkedList();
for (int i = 0; i < priorities.length; i++) {
q.offer(new int[]{priorities[i], (location == i) ? 1 : 0});
}
Arrays.sort(priorities);
int maxIdx = priorities.length - 1;
while (!q.isEmpty()) {
int[] get = q.poll();
if (get[0] != priorities[maxIdx]) q.offer(get);
else {
answer++;
maxIdx--;
if (get[1] == 1) break;
}
}
return answer;
}
}
Queue<int[]> q = new LinkedList();
for (int i = 0; i < priorities.length; i++) {
if (i == location) q.add(new int[]{priorities[i], 1});
else q.add(new int[]{priorities[i], 0});
}
형태 : int[]{ 우선순위, 목표물이면 1 목표물 아니면 0}
Arrays.sort(priorities);
int order = priorities.length - 1;
우선순위가 높은 순서부터 뽑아야 하기때문에 정렬
내림차순 대신 거꾸로 인덱스방향을 진행하기 위해 order 변수 생성
-> Arrays.sort()로 내림차순 하려면 배열 새로 만들어야됨 (int[] -> Integer())
while (!q.isEmpty()) {
// 목표물이 제일 마지막에 출력될수 있기떄문에 큐가 전부 빈 공간이 될때까지 반복
// 사실 큰 의미가 없는 부분인것 같다.
// 왜냐하면 목표물이 제일 마지막에 출력되어도 break문으로 인해 먼저 while이 종료되기 때문이다.
// 하지만 오류라던가 어떤 불가피한 상황으로 인해서
// priority와 location이 매치가 잘못 될 경우도 있지 않을까 하고 생각해보면
// 큐가 빈 공간이 될때까지 반복하는게 맞는것같다!
// 목표물인지 확인하기위해 큐에서 뽑아냄
// 목표물이면 반복문 종료
// 목표물이 아닌데 우선순위가 높으면 뽑아서 버림
// 목표물이 아닌데 우선순위가 낮으면 맨 뒤로 다시 입력
int[] priority = q.poll();
if (priority[0] == priorities[order]) {
answer++; // 1개 출력이 되었으므로 answer 1 증가
order--; // 우선순위가 제일 높은게 출력되었으므로 다음 우선순위를 조회하기위해 1 감소
if (priority[1] == 1) break; // 목표물이면 반복문 멈춤
} else {
q.add(priority); // 우선순위가 낮은애라서 맨 뒤로 다시 입력
}
}
처음 풀어본 날 : 23.03.18
다시 풀어본 새로 작성한 날 : 23.03.25
다시 풀어본 날 : 23.03.26, 30