[백준] 1931번: 회의실 배정
2018. 6. 2. 03:25ㆍ알고리즘
1931번: 회의실배정
(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.
www.acmicpc.net
회의실 배정 문제에서 중요한 포인트는 이 문제가 그리디 문제라는 것을 깨닫는 것입니다.
그리디 문제의 경우, 그리디 문제라는 것을 빨리 파악하는 것이 중요한데요.
이 문제의 경우 각기 다른 시작 시간과 종료 시간을 가진 회의들을 최적으로 배치하는 최적화 문제이므로 그리디임을 파악하기가 그리 어렵지 않았습니다.
그렇다면 회의들을 어떤 방식으로 배치해야할까요.
1. 회의의 길이로 정렬을 한다 - 시작 시간과 종료 시간이 있기 때문에 이 방식으로는 해결할 수 없습니다.
2. 회의의 시작 시간으로 정렬을 한다 - 시작 시간이 빠르더라도 종료 시간이 아주 늦는 경우가 있습니다.
3. 회의의 종료 시간으로 정렬을 한다 - 종료 시간이 빠른 순서대로 회의를 배치하는 경우가 최적의 방법이라 할 수 있습니다.
먼저 회의의 종료 시간을 기준으로 정렬을 하고, 그 정렬된 회의들 중 가능한 회의를 순서대로 배치합니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N;
int ans = 0;
struct meeting {
int start;
int end;
};
vector<meeting> schedule;
void input() {
cin >> N;
schedule.resize(N);
for (int i = 0; i < N; i++) {
cin >> schedule[i].start >> schedule[i].end;
}
}
bool cmp(meeting &u, meeting &v) {
if (u.end == v.end) {
return u.start < v.start;
}
return u.end < v.end;
}
void sortSchedule() {
sort(schedule.begin(), schedule.end(), cmp);
int end = 0;
for (int i = 0; i < N; i++) {
if (schedule[i].start >= end) {
ans += 1;
end = schedule[i].end;
}
}
}
void printAnswer() {
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false);
input();
sortSchedule();
printAnswer();
return 0;
}
'알고리즘' 카테고리의 다른 글
[백준] 1541번: 잃어버린 괄호 (0) | 2018.06.02 |
---|---|
[백준] 11399번: ATM (0) | 2018.06.02 |
[백준] 11047번: 동전 0 (0) | 2018.05.31 |
[백준] 1967번: 트리의 지름 (0) | 2018.05.31 |
[백준] 1167번: 트리의 지름 (0) | 2018.05.31 |