문제
한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
입력
첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다.
출력
첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다.
예제 입력 1
11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14
예제 출력 1
4
힌트
(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.
출처
- 빠진 조건을 찾은 사람: andy627
- 데이터를 추가한 사람: jws0324, kimchangyoung, rosedskim
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Time {
int startT;
int endT;
};
bool MinEndTime(Time i, Time j)
{
if (i.endT == j.endT)
return i.startT < j.startT;
return i.endT < j.endT;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int N;
cin >> N;
vector<Time> schedule;
Time temp;
for (int i = 0; i < N; i++)
{
cin >> temp.startT >> temp.endT;
schedule.push_back(temp);
}
sort(schedule.begin(), schedule.end(), MinEndTime);
vector<Time> tempV;
tempV.push_back(schedule[0]);
for (int i = 1; i < N; i++)
{
if (schedule[i].startT >= tempV[tempV.size() - 1].endT)
{
tempV.push_back(schedule[i]);
}
}
cout << tempV.size();
return 0;
}
728x90
반응형
'알고리즘 > solved.ac' 카테고리의 다른 글
[class3] (백준 11047) 동전 0 (0) | 2021.11.18 |
---|---|
[class3] (백준 5525) IOIOI (0) | 2021.11.17 |
[class3] (백준 1780) 종이의 개수 (0) | 2021.11.15 |
[class3] (백준 1541) 잃어버린 괄호 (0) | 2021.11.14 |
[class3] (백준 1012) 유기농 배추 (0) | 2021.11.13 |