풀이 방법 : 그리디
- 먼저 입력된 데이터에 대해 회의 시작 시간을 기준으로 오름차순으로 정렬해준다.
- 가장 먼저 시작하는 회의(0번 인덱스)의 자료를 우선순위 큐에 넣어준다.
- 이때 우선순위 큐의 정렬 기준은 종료시간이 가장 빠른 녀석이 pop되도록 해준다.
- 순서대로(회의시간이 빠른 녀석들 먼저) 우선순위 큐에서 꺼낸 회의와 비교한다.
- 우선순위 큐에서 꺼낸 회의의 종료 시간 > 회의의 시작 시간인경우 회의 시간이 겹치는 것이다. 이 경우 우선순위 큐에 넣어준다.(새로운 회의실 배정) 그렇지 않을 경우 우선순위 큐에서 pop해주고 새로운 회의를 우선순위 큐에 넣어준다(기존의 회의실 이용가능).
- 5번 과정을 반복하며 우선순위 큐의 size의 Max값을 구해준다.
- 이미 처음에 회의시간을 기준으로 오름차순 정렬을 했으니 당연히 비교값으로 들어오는 것들은 우선순위 큐에 들어가있는 회의들보다 무조건 나중에 시작하는 회의들이다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
struct Schedule
{
int Start = 0;
int End = 0;
};
struct cmp
{
bool operator() (const Schedule& A, const Schedule& B)
{
return A.Start < B.Start;
}
};
struct pqCmp
{
bool operator() (const Schedule& A, const Schedule& B)
{
return A.End > B.End;
}
};
int main()
{
int N;
cin >> N;
vector<Schedule> vecSche(N);
for (int i = 0; i < N; ++i)
{
cin >> vecSche[i].Start >> vecSche[i].End;
}
sort(vecSche.begin(), vecSche.end(), cmp());
int Max = 0;
priority_queue<Schedule, vector<Schedule>, pqCmp> pqSchedule;
pqSchedule.push(vecSche[0]);
for (int i = 1; i < N; ++i)
{
Schedule Top = pqSchedule.top();
if (Top.End > vecSche[i].Start)
pqSchedule.push(vecSche[i]);
else
{
pqSchedule.pop();
pqSchedule.push(vecSche[i]);
}
Max = max(Max, (int)pqSchedule.size());
}
cout << Max;
}
그리디 문제는 항상 풀면서도 이게 진짜 맞나 싶어서 중간에 고치다가 틀리곤 한다... 풀어도 풀어도 어렵다...