halang-log
💡 PS

[BOJ] 1379 강의실 2

date
Mar 10, 2022
slug
boj-1379
author
status
Public
tags
PS
summary
강의실 2 문제에 대한 풀이입니다.
type
Post
thumbnail
category
💡 PS
updatedAt
Aug 3, 2023 09:09 AM
언어

문제

풀이

주어지는 강의에 대해 시작하는 시간과 끝나는 시간을 내림차순으로 정렬해주었다. 그리고 우선순위 큐는 강의의 시작 시간 기준으로 내림차순으로 정렬을 커스텀화 해주었다. 정렬된 강의에서 순서대로 아래의 사항들을 확인해준다.
💡
pq.top()의 시작 시간보다 현재 강의의 끝나는 시간이 같거나 작은지 -> 해당 강의실 배정 가능그렇지 않은지 -> 해당 강의실 배정 불가능
1번과 같은 상황일 때는 강의실에 배정이 가능하므로 강의 장소를 해당 강의실로 지정해준다. 2번과 같은 상황일 때는 새로운 강의실을 만들어준다.

코드

#include <cstdio> #include <algorithm> #include <queue> using namespace std; struct info { int nm, s, e; }; struct su { int nm, st; }; struct com { bool operator() (su a, su b) { if (a.st == b.st) return a.nm < b.nm; return a.st < b.st; } }; bool comp(info a, info b) { if (a.s == b.s and a.e == b.e) return a.nm < b.nm; else if (a.e == b.e) return a.s > b.e; return a.e > b.e; } int n; info arr[100000]; int ans[100001]; priority_queue<su, vector<su>, com> pq; void go() { for(int i = 0; i < n; i++) { if (pq.empty() or pq.top().st < arr[i].e) { pq.push({int(pq.size())+1, arr[i].s}); ans[arr[i].nm] = pq.size(); }else{ int tmp = pq.top().nm; ans[arr[i].nm] = tmp; pq.pop(); pq.push({tmp, arr[i].s}); } } } int main() { scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%d %d %d", &arr[i].nm, &arr[i].s, &arr[i].e); } sort(arr, arr + n, comp); go(); printf("%d\n", pq.size()); for(int i = 1; i <= n; i++) printf("%d\n", ans[i]); }