Coding Test/Programmers

프로세스 (Process)

JTB 2025. 10. 14. 20:20

난이도: 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 일치 시 반환
주의점 단순 정렬로 풀면 실제 실행 순서를 잃음

이 문제는 단순한 우선순위 정렬 문제가 아니라, “큐의 회전과 실행 흐름을 시뮬레이션하는 문제” 로,

실제 운영체제의 프로세스 스케줄링과 매우 유사한 동작 방식을 구현해내는 것이 포인트라 생각한다.