프로세스_복습

하이솝·2026년 7월 28일

2026.07.28

문제 풀이

나의 코드


소요 시간: 37분
시간 복잡도: O(n3)O(n^3)


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;
    }
}

AI 코드


시간 복잡도: O(n2)O(n^2)


코드 분석

인덱스우선순위의 분리
인덱스는 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 코드와 같이 응용을 해서 사용한다는 발상 자체가 떠오르지 않는다.

문제집에서 풀어 봤던 문제는 잘 푸는 것 처럼
이와 같은 응용된 코드를 많이 보면서
부족한 코드의 응용을 하는 방법에 익숙해지는 수 밖에 없다.

0개의 댓글