운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.
현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.
import java.util.*;
class Solution {
public int solution(int[] priorities, int location) {
// 우선순위를 담은 리스트 생성 및 초기화
List<Integer> sorted = new ArrayList<>();
for (int priority : priorities) {
sorted.add(priority); // 각 우선순위를 리스트에 추가
}
// 우선순위 리스트를 내림차순으로 정렬
Collections.sort(sorted, Collections.reverseOrder());
int order = 0;
// 프로세스 실행 순서 결정
while (true) {
// 원래의 우선순위 배열을 순회하며 처리
for (int i = 0; i < priorities.length; i++) {
// 현재 순서에 해당하는 우선순위가 있는지 확인
if (priorities[i] == sorted.get(order)) {
order++;
// 현재 프로세스가 찾고자 하는 위치의 프로세스인지 확인
if (i == location) {
return order;
}
}
}
}
}
}
문제는 운영체제에서 프로세스를 관리하는 방식과 유사하다. 즉, 주어진 우선순위에 따라 프로세스가 실행되는 순서를 계산하는 문제다.
사실 원래 큐를 사용하는 것이 일반적인 방법이지만, 이 문제에서는 ArrayList와 Collections.sort를 활용해 문제를 풀었다.
큐 대신 리스트를 사용한 이유는 다음과 같다.
우선순위 정렬의 필요성
이 문제에서 중요한 부분은 우선순위를 기준으로 프로세스 실행 순서를 정하는 것. 큐를 사용하면, 우선순위를 매번 비교하면서 프로세스를 재배치해야 한다. 반면, 리스트를 사용해 미리 내림차순으로 정렬해두면, 매번 순회를 통해 실행 순서를 쉽게 결정할 수 있다.
간결성
ArrayList와 정렬을 사용함으로써 코드를 보다 직관적이고 간결하게 작성할 수 있다. 큐를 사용할 경우, 큐에서 요소를 꺼내고 다시 넣는 작업이 필요하지만, 정렬된 리스트를 사용하면 이러한 작업이 줄어들기 때문이다.
즉, 우선순위가 이미 정렬된 상태에서 비교 연산만 수행하는 것이 더 간단한 연산이라 판단하여 푼 문제.
문제를 통해 운영체제에서 프로세스를 관리하는 기본적인 개념을 실습할 수 있었고, 자료구조를 선택할 때 문제의 본질을 정확히 파악하는 것이 얼마나 중요한지를 다시 한번 느꼈다. 특히 큐와 리스트를 비교하면서, 각각의 자료구조가 어떤 상황에서 더 적합한지에 대한 이해도가 깊어졌다.