Post

(백준) 23088번 - Aging

(백준) 23088번 - Aging

(백준) 23088번 - Aging

문제

https://www.acmicpc.net/problem/23088

풀이

프로세스들을 우선순위 큐에 넣되, aging을 일일히 구현하면 시간 초과가 발생한다.

우선순위를 $P$, 실행 요청 시각을 $R$이라고 할 때, 특정 시각 $T$에서 $i$번째 프로세스의 우선순위는 $P_i+(T-R_i)$이다. $T$는 모든 프로세스에게 동일하게 더해지므로, 우선순위 큐의 상대적 순서는 $P$와 $R$만 고려해도 무방하다. 즉, 우선순위 큐에 프로세스를 삽입할 때, $P_i$가 아니라 aging을 고려한 우선순위인 $P_i-R_i$을 넣게 되면, aging을 위해 매번 poppush 연산을 수행하지 않아도 된다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <tuple>
#include <queue>
#include <vector>

using namespace std;
typedef tuple<int,int,int> tii;

int main() {
    cin.tie(0);
    ios::sync_with_stdio(0);

    int n;
    cin>>n;

    // 실행 순위: 우선순위 높음 > 실행 시간 짧음 > 먼저 등장
    vector<tii> v; // 실행 요청 시점, 초기 우선순위, 실행 시간
    for (int i=0;i<n;i++) {
        int a,b,c; // 실행 요청 시점, 초기 우선순위, 실행 시간
        cin>>a>>b>>c;
        v.push_back({a,b,c});
    }

    int curTime=0;
    int idx=0;
    priority_queue<tii> pq; // 보정된 우선순위, -실행시간, -등장 번호
    while (idx<n||!pq.empty()) {
        // 현재 시간까지 도착한 작업 pq에 삽입
        while (idx<n&&get<0>(v[idx])<=curTime) {
            pq.push({get<1>(v[idx])-get<0>(v[idx]),-get<2>(v[idx]),-(idx+1)});
            idx++;
        }

        // 처리할 작업 없는 경우
        if (pq.empty()) {
            curTime=get<0>(v[idx]);
        }
        else {
            int num=-get<2>(pq.top());
            cout<<num<<" ";
            curTime-=get<1>(pq.top());
            pq.pop();
        }
    }
}

시간복잡도

각 프로세스는 정확히 한 번 push되고 pop되므로 전체 시간복잡도는 $O(NlogN)$이다.

공간복잡도

$N$개의 프로세스를 벡터와 우선순위 큐에 저장하므로 전체 공간복잡도는 $O(N)$이다.

This post is licensed under CC BY 4.0 by the author.