정올 문제풀이
문제
회의실이 하나 있다.
여러 회의들이 시작시간과 종료시간이 예약되어 있으며, 시간대가 겹치는 회의는 동시에 개최가 불가능하다.
따라서 같은 시간대에 속하는 회의들 중 하나만 개최하고 나머지 회의들은 버려야한다.
단, 종료시간과 시작시간이 같은 경우에는 시간이 겹친다고 말하지 않는다.
회의의 개수 N과 각 회의의 시작시간, 종료시간이 주어졌을 때 되도록 많은 회의를 개최하고자 한다.
회의를 최대한 많이 배정하는 프로그램을 작성하시오.
입력
첫줄에는 회의의 수 N(5≤N≤500),
둘째 줄부터 i-1번 회의의 번호와 시작시간과 종료시간이 차례로 주어진다. (500 이하의 자연수)
한 회의에서 시작시간과 종료시간이 같은 경우는 주어지지 않는다.
출력
첫줄에는 배정 가능한 최대의 회의수를 출력하고
다음 줄부터는 배정한 회의의 번호를 시간대순으로 출력한다.
만약, 답이 여러 가지(최대회의수가 될 수 있는 배정 방법이 여러가지)라면 그 중 아무거나 하나 출력한다.
입력 예 | 출력 예 |
6 1 1 10 2 5 6 3 13 15 4 14 17 5 8 14 6 3 12 |
3 2 5 4 |
간단 구현 설명
회의가 끝나는 시간 순서대로 정렬
i번째 데이터의 끝나는 시간과 i+1번째 데이터의 시작하는 시간을 비교해서 끝시간 <= 시작시간 이면 결과배열에 추가
결과배열의 사이즈 출력
결과배열 순환하며 번호 출력
제출코드
더보기
c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Data
{
int num;
int enter;
int exit;
};
bool compare(Data dat1, Data dat2)
{
return dat1.exit < dat2.exit;
}
int main()
{
vector<Data> vec;
vector<Data> vec2;
Data data;
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d %d %d", &data.num, &data.enter, &data.exit);
vec.push_back(data);
}
sort(vec.begin(), vec.end(), compare);
vec2.push_back(vec.front());
for (int i = 1; i < n; i++)
{
if (vec2.back().exit <= vec[i].enter)
vec2.push_back(vec[i]);
}
printf("%d\n", vec2.size());
for (auto data : vec2)
printf("%d ", data.num);
return 0;
}
반응형
'코딩테스트 > 정올' 카테고리의 다른 글
정올 2194 요플레 공장 문제풀이 (0) | 2020.07.02 |
---|---|
정올 1828 냉장고 (0) | 2020.07.01 |
정올 1816 외양간 문제풀이 (0) | 2020.06.25 |
정올 기초다지기 출력 자가진단5 (0) | 2017.09.18 |
정올 기초다지기 출력 자가진단4 (0) | 2017.09.14 |