본문 바로가기

Coding Test

백준 11000 강의실 배정

 

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

 

11000번: 강의실 배정

첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109)

www.acmicpc.net

 

 

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>


using namespace std;


vector<pair<int, int>> cls;

priority_queue<int, vector<int>, greater<int>> pq;






int main() {


    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n;


    cin >> n;

    for (int i = 0; i < n; i++) {
        int s, e;

        cin >> s >> e;

        cls.push_back({s, e});

    }

    //먼저 시작하는 회의부터 계산
    sort(cls.begin(), cls.end());


    pq.push(cls[0].second);
    for (int i = 1; i < n; i++) {
        //현재 확인하려는 수업이 가장 빨리 끝나는 수업보다 늦게 시작한다면 해당 강의실의 수업 갱신
        if (cls[i].first >= pq.top()) {
            pq.pop();
            pq.push(cls[i].second);
        }
        //아니면 새로운 강의실에서 수업 진행
        else {
            pq.push(cls[i].second);
        }


    }


    cout << pq.size();




    return 0;
}

 

예시 1번 케이스를 예로 들어보자

3

1 3

2 4

3 5

 

pq는 각 강의실의 마지막 시간, 즉 해당 강의실을 사용할 수 있는 시작 시간이다.

우선순위 큐를 사용하게 되면 가장 빨리 사용할 수 있는 강의실에 강의를 배정할 수 있게 된다.

 

일단 첫 번째 강의는 1번 강의실을 배정받는다.

그 다음 강의는 1번 강의와 일정이 겹치므로 다음 강의실을 배정받는다.

마지막 강의는 가장 빨리 끝나는 1번 강의보다 늦게 시작하므로 이 강의실을 사용할 수 있는 시각을 3->5로 업데이트 한다.

 

'Coding Test' 카테고리의 다른 글

백준 21919 소수 최소 공배수  (1) 2024.03.25
백준 17276 배열 돌리기  (1) 2024.03.23
백준 17836 공주님을 구해라!  (0) 2024.03.21
백준 15486 퇴사 2  (2) 2024.03.20
백준 2448 별 찍기 (11)  (0) 2024.03.19