💡 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]); }