Notice
Recent Posts
Recent Comments
Link
DY N DY
알고리즘 회의실 배정(C++) 본문
1370 : 회의실 배정
제한시간: 1000 ms 메모리제한: 32 MB
해결횟수: 2020 회 시도횟수: 5389 회 Special Judge
회의실이 하나 있다. 여러 회의들이 시작시간과 종료시간이 예약되어 있으며, 시간대가 겹치는 회의는 동시에 개최가 불가능하다. 따라서 같은 시간대에 속하는 회의들 중 하나만 개최하고 나머지 회의들은 버려야한다.
단, 종료시간과 시작시간이 같은 경우에는 시간이 겹친다고 말하지 않는다. 회의의 개수 N과 각 회의의 시작시간, 종료시간이 주어졌을 때 되도록 많은 회의를 개최하고자 한다.
회의를 최대한 많이 배정하는 프로그램을 작성하시오.
[Copy]6 1 1 10 2 5 6 3 13 15 4 14 17 5 8 14 6 3 12 | [Copy]3 2 5 4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | /************************************************************** Problem: 1370 User: a132034 Language: C++ Result: Success Time:0 ms Memory:1740 kb ****************************************************************/ #include <iostream> using namespace std; struct room { int num; int start; int end; }; room meetingRoom[555]; int partition(room* arr, int start, int end) { int pivot = arr[start].end; int left = start; int right = end; while (left <= right) { while (left <= end && arr[left].end <= pivot) left++; while (right >= start + 1 && arr[right].end >= pivot) right--; if (left <= right) swap(arr[left], arr[right]); } swap(arr[start], arr[right]); return right; } void quickSort(room *arr, int start, int end) { if (start < end) { int pivot = partition(arr, start, end); quickSort(arr, pivot + 1, end); quickSort(arr, start, pivot - 1); } } int queue[555]; int front = 0; int rear = 0; int main() { ios::sync_with_stdio(false); int N; cin >> N; for (int i = 1; i <= N; ++i) cin >> meetingRoom[i].num >> meetingRoom[i].start >> meetingRoom[i].end; quickSort(meetingRoom, 1, N); int curEnd = 0; int numOfMeeting = 0; for (int i = 1; i <= N; ++i) { if (curEnd <= meetingRoom[i].start) { queue[++rear] = meetingRoom[i].num; curEnd = meetingRoom[i].end; numOfMeeting++; } } cout << numOfMeeting << endl; while (front < rear) { cout << queue[++front] << " "; } return 0; } | cs |
그리디 알고리즘.
그리디 알고리즘이라는걸 알고나면 크게 어렵지 않은 문제같다.
우선 문제풀이 자체는 끝나는 시간이 가장 먼저인 것 부터 정렬한 후에
가장 먼저 끝나는 회의를 차례대로 겹치지 않는 순서로 선택하는 것이다. (탐욕적으로 뒤의 일은 생각하지 않고 선택)
그리디 알고리즘의 가장 유명한 예제? 로 알고 있다. 학교에서도 거의 동일한 문제를 예제로 배운 적 있다.
때문에 크게 어렵지 않게 풀 수 있었으나... 아마 배운적이 없다거나 기억을 못했다면 어떻게 푸는지 고생좀 했을 것 같기도 하다.
간단한 것이지만 queue 자료구조와 sort 알고리즘(quick sort)을 직접 구현해 보았다.
그 외에는 크게 어려운 부분은 없다.
curEnd는 현재까지 배정한 회의중 마지막으로 끝나는 시간을 저장하는 변수이다.
'PARK > ALGORITHM' 카테고리의 다른 글
BOJ 2839 설탕배달(C++) (0) | 2017.03.02 |
---|---|
알고리즘 정렬(C++) (0) | 2016.12.22 |
알고리즘 엔디안(C++) (1) | 2016.12.21 |
BOJ 1002 터렛(C++) (1) | 2016.10.26 |
실력키우기 숫자 야구(C++) (3) | 2016.10.25 |