난이도: level2
링크: 프로세스
풀이 날짜: 2025.10.14
1. 문제 이해
운영체제의 프로세스들은 각각 우선순위(priority) 를 가지고 있으며, CPU는 가장 높은 우선순위의 프로세스부터 실행한다.
만약 대기열의 맨 앞 프로세스보다 더 높은 우선순위를 가진 프로세스가 뒤에 있다면, 그 프로세스는 맨 뒤로 이동한다.
이때, 내가 요청한 특정 위치(location)의 프로세스가 몇 번째로 실행되는지 구하는 문제이다.
2. 접근 아이디어
이 문제는 “우선순위 기반 프로세스 스케줄링”을 큐(Queue) 로 시뮬레이션하는 문제다.
아이디어를 정리하면 아래와 같다.
2. 각 프로세스를 index와 우선순위(priority) 로 묶어 관리한다.
let queue = priorities.map((val, idx) => ({ idx, val }));
2. 큐의 맨 앞 프로세스를 꺼내(shift()), 뒤에 자신보다 우선순위가 높은 프로세스가 있는지(some()) 확인한다.
3. 더 높은 프로세스가 있다면 맨 뒤로 이동, 없다면 실행(printed) 리스트에 추가한다.
4. 실행된 프로세스의 인덱스가 내가 찾는 location과 일치하면, 현재까지 실행된 순서를 반환한다.
3. 풀이 코드
function solution(priorities, location) {
let queue = priorities.map((val, idx) => ({ idx, val })); // 인덱스와 값을 관리
const printed = [];
while (queue.length) {
const now = queue.shift(); // 맨 앞 프로세스를 꺼낸다.
const hasHigher = queue.some(v => v.val > now.val); // 뒤에 더 높은 우선순위 존재여부 확인
if (hasHigher) {
// 뒤로 이동
queue.push(now);
} else {
// 실행
printed.push(now);
// 여기에서! 방금 실행한 프로세스가 실행순서를 알고 싶은 프로세스라면, 실행 순서를 반환한다.
if (location === now.idx) return printed.length;
}
}
}
구분 | 복잡도 | 설명 |
시간 복잡도 | O(n²) | some()으로 큐 전체를 매번 순회하기 때문 |
공간 복잡도 | O(n) | 큐와 실행 결과를 저장하는 공간 |
4. 요약 및 정리
포인트 | 설명 |
탐색 구조 | Queue (FIFO) |
제어 방식 | some()으로 더 높은 우선순위 확인 후 push/실행 |
종료 조건 | location과 idx 일치 시 반환 |
주의점 | 단순 정렬로 풀면 실제 실행 순서를 잃음 |
이 문제는 단순한 우선순위 정렬 문제가 아니라, “큐의 회전과 실행 흐름을 시뮬레이션하는 문제” 로,
실제 운영체제의 프로세스 스케줄링과 매우 유사한 동작 방식을 구현해내는 것이 포인트라 생각한다.
'Coding Test > Programmers' 카테고리의 다른 글
다리를 지나는 트럭 (Bridge Truck) (0) | 2025.10.14 |
---|