728x90
🔗 문제 링크
💡 문제 풀이 및 해석
- 최대한 적은 강의실 사용
- 종료 시간과 시작 시간이 겹치는건 가능
- 따라서 가장 빨리 끝나는 강의 기준으로 가장 빨리 시작하는 강의가 이어서 할 수 있다면 새로운 강의실을 배정할 필요는 없다.
⭐️ 정답 코드 및 설명
#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
'알고리즘 문제 풀이' 카테고리의 다른 글
[ 백준 14503 ] 로봇 청소기 (C++) - 구현 (0) | 2024.03.06 |
---|---|
[ 백준 1405 ] 미친 로봇 (C++) - DFS (0) | 2024.03.05 |
[ 프로그래머스 ] 다단계 칫솔 판매 (C++) - 구현 (2) | 2024.03.05 |
[ 백준 1027 ] 고층 건물 (C++) - BruteForce (3) | 2024.03.05 |
[ 백준 1344 ] 축구 ( C++ ) - DP (0) | 2024.03.05 |