백준 - 19598번 : 최소 회의실 개수(C++)

RoundAbout·2023년 7월 30일
0

BaekJoon

목록 보기
7/90

풀이 방법 : 그리디

  1. 먼저 입력된 데이터에 대해 회의 시작 시간을 기준으로 오름차순으로 정렬해준다.
  2. 가장 먼저 시작하는 회의(0번 인덱스)의 자료를 우선순위 큐에 넣어준다.
  3. 이때 우선순위 큐의 정렬 기준은 종료시간이 가장 빠른 녀석이 pop되도록 해준다.
  4. 순서대로(회의시간이 빠른 녀석들 먼저) 우선순위 큐에서 꺼낸 회의와 비교한다.
  5. 우선순위 큐에서 꺼낸 회의의 종료 시간 > 회의의 시작 시간인경우 회의 시간이 겹치는 것이다. 이 경우 우선순위 큐에 넣어준다.(새로운 회의실 배정) 그렇지 않을 경우 우선순위 큐에서 pop해주고 새로운 회의를 우선순위 큐에 넣어준다(기존의 회의실 이용가능).
  6. 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;

}

그리디 문제는 항상 풀면서도 이게 진짜 맞나 싶어서 중간에 고치다가 틀리곤 한다... 풀어도 풀어도 어렵다...

profile
게임하고 피자 좋아함

0개의 댓글

관련 채용 정보