BOJ::12764 싸지방에 간 준하

[BOJ] : https://www.acmicpc.net/problem/12764

시사점

STL :: set insert, erase, begin, end 등의 함수를 제공합니다. set의 특성으로는 logN만에 삽입과 삭제가 가능합니다. 또한, set은 항상 정렬된 상태를 유지합니다.

이해(5)

설계(30)

int seat; // 사용한 전체 컴퓨터의 수 입니다.
int eachSeat[MAX_N]; // 각 좌석에 앉은 횟수입니다.
priority_queue<pair<int,int> > pq; // 종료시간(low), 사용중인 PC번호
set<int> leftPC; // 전체 seat개의 컴퓨터 중 사용되지 않는 컴퓨터의 목록을 정렬된 상태로 유지합니다. 
pair<int,int> time[MAX_N]; // 시작시간, 종료시간을 담습니다.

시간 복잡도

공간 복잡도

구현(x)

#include<iostream>
#include<queue>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
const int MAX_N = 100000 + 1;

int n;
int seat; // 전체 좌석 수 입니다.
int eachSeat[MAX_N]; // 각 좌석에 앉은 횟수입니다.
priority_queue<pair<int, int> > pq; // 종료시간(low), 사용중인 PC번호 // 현재 PC를 사용중인 목록을 유지합니다.
set<int> leftPC; // 전체 seat개의 컴퓨터 중 사용되지 않는 컴퓨터의 현황을 유지합니다.
pair<int, int> time[MAX_N];
void solve(){
    for (int i = 0; i < n; i++){
        // 사용 종료된 PC의 좌석들을 반납합니다.
        while (!pq.empty()){
            if ((-pq.top().first) <= time[i].first){
                leftPC.insert(pq.top().second);
                pq.pop();
            }
            else
                break;
        }

        // 남은 자리가 없는 경우
        if (leftPC.empty()){
            pq.push({ -time[i].second, seat });
            eachSeat[seat]++;
            seat++;
        }
        // 남은 자리가 있는 경우
        else{
            auto seatIdx = leftPC.begin();
            pq.push({ -time[i].second, *seatIdx });
            eachSeat[*seatIdx]++;
            leftPC.erase(seatIdx);
        }
    }
    cout << seat << endl;
}
int main(){
    //freopen("input.txt", "r", stdin);
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for (int i = 0; i < n; i++){
        cin >> time[i].first >> time[i].second;
    }
    sort(time, time + n);
    solve();
    for (int i = 0; i < seat; i++)
        cout << eachSeat[i] << " ";
    cout << endl;
    return 0;
}

디버깅(x)

좋은 코드

최적화