문제풀이/알고리즘 문제 풀이

[ 백준 1379 ] 강의실 2 (C++) - priority_queue

RealTone 2024. 3. 5. 21:10
728x90

🔗 문제 링크

 

1379번: 강의실 2

첫째 줄에 강의의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 줄마다 세 개의 정수가 주어지는데, 순서대로 강의 번호, 강의 시작 시간, 강의 종료 시간을 의미한다. 강의

www.acmicpc.net


💡 문제 풀이 및 해석

  1. 최대한 적은 강의실 사용
  2. 종료 시간과 시작 시간이 겹치는건 가능
  3. 따라서 가장 빨리 끝나는 강의 기준으로 가장 빨리 시작하는 강의가 이어서 할 수 있다면 새로운 강의실을 배정할 필요는 없다.

⭐️ 정답 코드 및 설명

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#define endl "\n"

using namespace std;

int N;
priority_queue<pair<int, int>> q; // 끝나는 시간, 강의실 번호
vector<pair<int, pair<int,int>>> Class; // Start, end, num
vector<int> answer(100001); // 강의마다 배정된 강의실 번호
void input() {

    cin >> N;

    for (int i = 0; i < N; i++) {
        int num, start, end;
        cin >> num >> start >> end;
        Class.push_back({ start,{end,num} });
    }
    sort(Class.begin(), Class.end()); // 강의 시작시간 기준으로 오름차순 정렬
}

// 강의시간이 빠른것부터 pq에 push => pq에 가장빨리 끝나는 강의시간부터 나와있음
// 그 다음 강의가 이어질수 pq의 top 다음에 들어갈 수 있다? 그럼 pop 해주고 push 해줌.

void sol() {

    int K = 1;

    for (int i = 0; i < Class.size(); i++) {
        int st = Class[i].first;
        int et = Class[i].second.first;
        int cn = Class[i].second.second;

        if (!q.empty()) {
            if (-q.top().first <= st) { // 가장 빨리 끝나는 강의 다음에 강의가 가능하다면
                //cout << -q.top().first << ", " << st << endl;
                q.push({ -et,q.top().second }); 
                answer[cn] = q.top().second;
                q.pop();
            }
            else { // 안된다면, 새로운 강의실 배정
                q.push({ -et, ++K });
                answer[cn] = K;
            }
        }
        else {
            q.push({ -et,1 }); // 맨 처음은 1번 강의실 배정
            answer[cn] = 1;
        }
    }
    cout << K << endl;
    for (int i = 1; i <= N; i++) {
        cout << answer[i] << endl;
    }
}

int main() {

    ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0); // 이거 안해주면 시간초과
    input();
    sol();

    return 0;
}

🤔 문제 후기

오랜만에 풀다보니 ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0); 문을 넣지 않아서 처음에는 시간초과가 났다. 10가지의 경우가 입력되도 시간초과가 날 부분은 없는데, 시간초과가 나서 이유를 모르다가 도저히 모르겠어서 구글링 했는데, 이 부분을 까먹어서 시간초과가 난 것을 알았다. 골드3 문제 치고는 매우 쉬워서 입출력 관련 부분을 제외하면 20분 정도밖에 안걸렸다.

728x90