본문 바로가기

Programmers

[프로그래머스][JAVA]Lv. 2 - 프로세스

https://school.programmers.co.kr/learn/courses/30/lessons/42587

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 실행 대기 큐(Queue)에서 대기 중인 프로세스 하나를 꺼냅니다.
2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
  3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.


먼저 이중배열이 들어가는 Deque를 만들어서 중요도(priorities)와 순서를 차례대로 넣어주었다.

Deque<int[]> deque = new ArrayDeque<>();
for (int i = 0; i < priorities.length; i++) {
    int[] insert = new int[2];
    insert[0] = priorities[i];
    insert[1] = i;
    deque.add(insert);
}

그다음 먼저 pri라고 중요도를 오름차순으로 정렬한 것을 이용하여 만약 deque의 앞쪽 부분이 중요도가 가장 높은 것과 같다면 deque에서 빼주고 그 순서를 배열에 정리하였다. 그리고 만약 중요도와 같지 않다면 deque의 끝부분에 앞쪽 부분을 빼서 넣어주었는 것을 반복하였다.

for (int i = priorities.length - 1; i >= 0; i--) {
    while (true) {
        int[] value = deque.peekFirst();
        if (value[0] == pri[i]) {
            index[idx] = value[1];
            idx++;
            deque.pollFirst();
            break;
        } else {
            deque.addLast(deque.pollFirst());
        }
    }
}

모든 작업이 끝나면 location을 찾아서 해당 순서 + 1을 해주어 정답을 구했다.

for (int i = 0; i < index.length; i++) {
    if (index[i] == location)
        answer = i+1;
}
return answer;

아래는 전체 코드

import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
        int[] pri = priorities.clone();
        int[] index = new int[priorities.length];
        int idx = 0;
        Arrays.sort(pri);

        Deque<int[]> deque = new ArrayDeque<>();
        for (int i = 0; i < priorities.length; i++) {
            int[] insert = new int[2];
            insert[0] = priorities[i];
            insert[1] = i;
            deque.add(insert);
        }
        for (int i = priorities.length - 1; i >= 0; i--) {
            while (true) {
                int[] value = deque.peekFirst();
                if (value[0] == pri[i]) {
                    index[idx] = value[1];
                    idx++;
                    deque.pollFirst();
                    break;
                } else {
                    deque.addLast(deque.pollFirst());
                }
            }
        }
        for (int i = 0; i < index.length; i++) {
            if (index[i] == location)
                answer = i+1;
        }
        return answer;
    }
}