본문 바로가기
Beakjoon&프로그래머스/Java

[프로그래머스/Java] 프로세스

by 현장 2026. 1. 3.

-Code

import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
        int length = priorities.length;
        // 덱에 배열 저장
        Deque<int[]> dq = new ArrayDeque<>();
        for (int i = 0; i < length; i++) {
            int[] valueAndIdx = {priorities[i], i};
            dq.addLast(valueAndIdx);
        }
        while (!dq.isEmpty()) {
            int[] now = dq.pollFirst();
            // 지금보다 큰 값이 존재하는지 확은
            boolean hasBigVal = false;
            for (int[] valAndIdx : dq) {
                if (valAndIdx[0] > now[0]) {
                    hasBigVal = true;
                    break;
                }
            }
            if (hasBigVal) {
                // 큰 값 존재시 뒤로 이동
                dq.addLast(now);
            } else  {
                // 큰 값이없으면 poll
                answer++;
                // location과 현재 값의 idx가 같으면 반환
                if (now[1] == location) {
                    return answer;
                }
            }
        }
        return answer;
    }
}

덱에 배열을 저장해서 시작은 했으나 문제 접근을 처음에 잘못해서 이상한 값을 출력했습니다. 그래서 찾아보니 location에 해당하는 priorities에 해당하는 값이 나올 때까지 counter를 하나씩 높이면서 해당하는 값이 나오면 counter를 출력하는 문제였습니다.

for문으로 현재 덱에 최대 값인지 확인해서 그 결과로 계산을 해서 해결했습니다.

import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
        int length = priorities.length;
        // 우선 순위 큐를 내림차순 선언 및 덱과 함께 배열 저장
        Deque<int[]> dq = new ArrayDeque<>();
        PriorityQueue<Integer> pq = new PriorityQueue(Collections.reverseOrder());
        for (int i = 0; i < length; i++) {
            int[] valueAndIdx = { priorities[i], i };
            dq.addLast(valueAndIdx);
            pq.add(priorities[i]);
        }

        while (!dq.isEmpty()) {
            int[] now = dq.pollFirst();
            // 지금보다 큰 값이 존재하는지 우선순위 큐로 확인
            if (pq.peek() > now[0]) {
                // 큰 값 존재시 뒤로 이동
                dq.addLast(now);
            } else  {
                // 큰 값이없으면 poll
                answer++;
                pq.poll();
                // location과 현재 값의 idx가 같으면 반환
                if (now[1] == location) {
                    return answer;
                }
            }
        }
        return answer;
    }
}

우선 순위 큐라는 것이 있어서 해당 큐를 내림 차순으로 정렬되게 설정하고 최대 값을 비교하는 식으로해서 시간 복잡도를 좋게 바꾸어도 봤습니다.