문제 출처 :https://www.acmicpc.net/problem/1931
1. 문제 설명
1) 회의 최대 개수 찾기
2) 조건 : 시작하자마자 끝나는 경우: 시작시간 == 끝나는 시간
2. 로직
1) 우선순위 큐 이용한 오름차순 정렬(heap) (우선순위 작은 순서 순으로, 1순위. endTime , 2순위. startTime)
2) 우선순위 큐로 정렬 된 n개의 인덱스들 중 첫번째 idx의 endTime과 두번째 idx의 firstTime 비교.
중복범위가 아닌이상 카운팅하기. (중복되지 않는 조건: first.endTime <= second.startTime)
카운팅한 부분과 중복된 부분은 pop함수로 후보를 줄여나갑니다.
3. example
Input:
8
1 3
2 3
3 3
4 4
5 5
6 6
7 7
3 6
answer: 6
#include<bits/stdc++.h>
using namespace std;
struct Node
{
int startTime;
int endTime;
int period;
};
//우선 순위 q 구조체 타입 조건에 의한 비교
//조건 1 : endTime이 짧은 순으로 우선순위정렬, 조건2 : endTime이 동일하면 start값이 낮거나 같은 값이 우선순위로 정렬
bool operator<(Node v, Node tar) {
if (tar.endTime < v.endTime) return 1;
else if (tar.endTime > v.endTime) return 0;
return tar.endTime == v.endTime && (tar.startTime <= v.startTime);
}
int main(void) {
priority_queue<Node>meeting;
int n;
cin >> n;
for (int x = 0; x < n; ++x) {
int startTime, endTime, period;
cin >> startTime >> endTime;
period = endTime - startTime;
meeting.push({ startTime,endTime,period }); // 우선순위 큐 에 원소 값 push하면 heap정렬이 자동으로 조성됨 그러나 기본이 내림차순이기에 operator 함수 내용안에 있는 조건에 의해 오름차순으로 정렬.
}
int cnt = 0;
//사이즈가 1이면 진행할 필요없이 1 출력.
if (meeting.size() == 1) {
cout << 1;
return 0;
}
//위 우선순위 큐 정렬에 의해 end값들이 작은 순으로 오름차순이 정렬되어진 상태이다.
//첫번째의 인덱스[기준]와 두번째의 인덱스[타겟]를 비교하면서 두번째 인덱스가 첫번째 인덱스 범위에 포함되면 두번째 인덱스를 차차 삭제해나가면서
// 범위 안에 포함되지 않는 부분들만 counting해나간다.
while (meeting.size() != 0) {
//[기준] first
int first_start = meeting.top().startTime;
int first_end = meeting.top().endTime;
int first_period = meeting.top().period;
meeting.pop(); // 후보 줄이기
if (meeting.size() == 0) {
break;
}
while (meeting.size() != 0) {
//[타겟] second
int second_start = meeting.top().startTime;
int second_end = meeting.top().endTime;
int second_period = meeting.top().period;
meeting.pop(); // 후보줄이기.
if (first_end <= second_start) { // =을 사용한 이유 : (문제 조건) 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
meeting.push({second_start, second_end, second_period}); // 첫번째 인덱스 내부에 두번째 인덱스가 포함되지 않으면 삭제된 두번째 인덱스를 기준으로 설정 위해 push.
break;
}
}
}
cout << cnt << endl;
}
비율
로직 생각 : 구현 : 디버깅 = 5 : 2 : 3
회고
우선순위 큐 오랫만에 사용하여 개념을 상기했다.
다중 조건 오랫만에 하니 헷갈렸다. 많이 사용해보자.
다른 사람 풀이
'PS > 백준' 카테고리의 다른 글
[한양대 HCPC 2023] Pipelined (백준: 30874번) (0) | 2024.11.01 |
---|---|
15686 치킨배달 (0) | 2024.08.22 |
1062번 가르침 [다시보기] (0) | 2024.07.24 |
10844번 쉬운 계단 수 (0) | 2024.07.08 |
한국이 그리울 땐 서버에 접속하지 (0) | 2023.08.26 |