문제
1931번: 회의실 배정
(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.
www.acmicpc.net
코드
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main() {
int N, s, e, sum=1;
vector<pair<int, int>> schedule;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> s >> e;
schedule.push_back(make_pair(e, s));
}
sort(schedule.begin(), schedule.end());
int i = 0, j = 1;
while (j < N) {
if (schedule[i].first <= schedule[j].second) {
i = j;
sum++;
}
j++;
}
cout << sum;
}
풀이
1. 진행 가능한 회의의 수를 sum에 저장한다. (적어도 한 개의 회의는 가능하므로 sum=1)
2. 회의의 시작 시간과 끝나는 시간을 vector에 pair로 끝나는 시간, 시작하는 시간 순으로 저장한다. (끝나는 시간을 기준으로 오름차순 정렬하면, 끝나는 시간이 가장 빠른 회의부터 차례로 진행할 수 있음)
3. 벡터를 끝나는 시간을 기준으로 오름차순 정렬하여 차례로 다음회의의 시작 시간과 비교한다.
4. 다음 회의의 시작 시간이 현재 회의의 끝나는 시간보다 크거나 같으면 회의를 진행할 수 있으므로 sum++
5. 진행이 가능하다고 판단되는 새 회의를 기준으로 하여 다음 회의의 시작 시간과 비교한다.
6. 3~5 번을 반복한다.
'코테 > Greedy' 카테고리의 다른 글
[C/C++] 백준 1541, Greedy (0) | 2023.02.09 |
---|---|
[C/C++] 백준 11399, Greedy (0) | 2023.02.09 |
[C/C++] 프로그래머스 스쿨 무지의 먹방라이브, Greedy (0) | 2023.02.08 |
[C/C++] 나동빈 볼링공 고르기, Greedy (0) | 2023.02.07 |
[C/C++] 나동빈 만들 수 없는 금액, Greedy (0) | 2023.02.07 |