2026.07.28
소요 시간: 37분
시간 복잡도:
import java.util.Arrays;
class Solution {
public int solution(int[] priorities, int location) {
int maxIdx = 0;
int len = priorities.length;
for (int i = 1; i < len; i++) {
if (priorities[maxIdx] < priorities[i]) {
maxIdx = i;
}
}
int order = 1;
int idx = maxIdx;
while(true) {
while(true) {
int p = priorities[idx];
boolean isExist = Arrays.stream(priorities).anyMatch(a -> a > p);
if (!isExist) {
priorities[idx] = -1;
break;
}
idx = (idx + 1) % len;
}
if (idx == location) {
break;
}
idx = (idx + 1) % len;
order++;
}
return order;
}
}
시간 복잡도:
코드 분석
인덱스와 우선순위의 분리
인덱스는 queue, 우선순위는 sorted[]로 각각 분리하여 관리
우선순위의 경우 .sort()를 이용해 오름차순으로 정렬 후,
top값을 이용한 가장 후방의 인덱스부터 시작하여 내림차순처럼 사용함
인덱스의 경우 계속해서 순환하는 흐름을 만들어냄
0부터 시작하여 해당 인덱스에 해당하는 값이
soted[top]의 값과 동일한 경우, 현재 가장 높은 우선순위를 갖는 값이 된다.
두 값이 일치되면 top--를 하여
location과 일치할 때 까지 반복해서 진행한다.
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
class Solution {
public int solution(int[] priorities, int location) {
int n = priorities.length;
// 오름차순 정렬 후 뒤에서부터 꺼내면 = 남은 문서 중 최대 우선순위
int[] sorted = priorities.clone();
Arrays.sort(sorted);
int top = n - 1;
// 원래 인덱스를 큐에 담아 대기열 순서 유지
Deque<Integer> queue = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
queue.offer(i);
}
int order = 0;
while (!queue.isEmpty()) {
int cur = queue.poll();
if (priorities[cur] == sorted[top]) { // 최우선순위 → 인쇄
top--;
order++;
if (cur == location) {
return order;
}
} else { // 뒤로 밀기
queue.offer(cur);
}
}
return order;
}
}
나의 코드에서 anyMatch()를 사용하여
해당 값보다 더 큰 값이 있는지 탐색을 했기 때문에
maxIdx를 탐색하여 사용할 필요가 없었다.
이와 같이 코드의 개선점이 뚜렷하게 보였다.
두 번째로 AI 코드를 보며 든 생각이 있다.
예전부터 수학 시험을 보면,
기본 문제나 문제집에서 이미 풀어봤던 문제는 잘 풀었지만,
응용 문제의 경우에는 처음부터 막혀서 항상 풀지 못했다.
코딩도 마찬가지로 기본적인 사용은 쉽게 가능하지만,
위의 AI 코드와 같이 응용을 해서 사용한다는 발상 자체가 떠오르지 않는다.
문제집에서 풀어 봤던 문제는 잘 푸는 것 처럼
이와 같은 응용된 코드를 많이 보면서
부족한 코드의 응용을 하는 방법에 익숙해지는 수 밖에 없다.