1개의 회의실에 다양한 사용 시간으로 건의가 올 경우 가장 많은 회의를 진행할 수 있는 방법은?
이 문제를 어떻게 풀 수 있을까? 접근 방법을 찾는 것 자체부터 시간을 조그 오래 쏟았다. 가장 효율이 적게 하려면?
회의 시간이 가장 적으면서, 겹치지 않는 회의를 잡자
3시~5시, 5시~7시 같이 딱 맞아서 비는 시간이 없으면 더 좋을 것 같은데
3시~3시 이런 경우는 무조건 포함시켜줘서 많은 회의가 잡히도록
이 정도로 생각을 했는데 회의 시간이 작다? 라는 것에 대한 판단 기준을 어떻게 잡아야할지가 감이 안잡혔다. 임의로 정하는 것은 말이 안되는데 최대한 적게 해야하는데 이 부분에서 많은 고민을 했다.
고민을 하다가 생각하게 된 방법은 시간대 순서별로 반복문을 돌리면서 해당 시간대에 사용보다 더 효율적인 시간대가 있다면 그 시간대로 잡고 진행을 하려고 했다.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int All_meeting = 0;
int Start_Time[100000];
int End_Time[100000];
int temp = 0;
scanf("%d", &All_meeting);
for (int i = 0; i < All_meeting; i++)
{
scanf("%d %d", &Start_Time[i], &End_Time[i]);
}
//<--------------오름차순 정렬------------------>
for (int j = 0; j < All_meeting; j++)
{
for (int i = 0; i < All_meeting - 1; i++)
{
if (Start_Time[i] > Start_Time[i + 1])
{
temp = Start_Time[i];
Start_Time[i] = Start_Time[i + 1];
Start_Time[i + 1] = temp;
temp = End_Time[i];
End_Time[i] = End_Time[i + 1];
End_Time[i + 1] = temp;
}
}
}
//<---------------테스트 출력----------------->
for (int i = 0; i < All_meeting; i++)
{
printf("[%d %d]\n", Start_Time[i], End_Time[i]);
}
//해당 시간이 됬을 때랑, 지나갔을 떄?랑 비교를 할까?
//해당 시간대에서 조건문을 걸고, 해당 시간대 안에서
//더 적은 시간을 소비하면서 숫자가 작다면 ?
int Room_Count = 0;
int TakeTime = 0;
int CompareTime = 0;
int Max = 0;
//시간대 별로 체크 시작
for (int i = 0; i < All_meeting; i++)
{
if (Start_Time[i] < Max)
continue;
printf("===================================\n");
TakeTime = End_Time[i] - Start_Time[i];
printf("현재 대상 : %d 시간 소요\n", TakeTime);
//만약 더 효율적인 시간이 존재한다면?
for (int j = i + 1; Start_Time[j] < End_Time[j]; j++)
{
CompareTime = End_Time[j] - Start_Time[j];
if (CompareTime < TakeTime)
{
printf("%d 시간보다 더 효율적 시간 : %d\n", TakeTime, CompareTime);
Room_Count++;
Max = End_Time[j];
//문제 -> 결정한 시간의 끝자락으로 이동하자
//i를 변경하거나 조건문을 걸어버리자!
break;
}
}
}
}
/*
0 6
1 4 x
2 13
3 5
5 7 x
5 9
6 10
8 11 x
8 12
12 14
*/