코딩테스트/정올

정올 1370 회의실 배정

글로벌디노 2020. 6. 30. 19:36

정올 문제풀이

1370번 : 회의실 배정

 

 

문제

회의실이 하나 있다.

여러 회의들이 시작시간과 종료시간이 예약되어 있으며, 시간대가 겹치는 회의는 동시에 개최가 불가능하다.
따라서 같은 시간대에 속하는 회의들 중 하나만 개최하고 나머지 회의들은 버려야한다.
단, 종료시간과 시작시간이 같은 경우에는 시간이 겹친다고 말하지 않는다.
회의의 개수 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;
}