728x90
SMALL
백준 문제 풀이: 1931 [회의실 배정]
문제 링크: https://www.acmicpc.net/problem/1931
문제 설명:
한 개의 회의실이 있을 때, 회의가 겹치지 않도록 최대한 많은 회의를 배정하는 프로그램을 작성하세요.
입력 조건:
- 첫째 줄에 회의의 수 `n`이 주어집니다. (1 ≤ n ≤ 100,000)
- 다음 `n`개의 줄에는 각 회의의 시작 시간과 끝나는 시간이 공백으로 구분되어 주어집니다.
- 각 회의의 시작 시간과 끝나는 시간은 231-1 이하의 자연수입니다.
출력 조건:
- 첫째 줄에 회의실에서 열 수 있는 최대 회의 수를 출력합니다.
문제 해결 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
vector<pair<int, int>> v;
for (int i = 0; i < n; i++) {
int start, end;
cin >> start >> end;
v.push_back({end, start}); // 끝나는 시간을 기준으로 정렬하기 위해 저장
}
sort(v.begin(), v.end()); // 끝나는 시간 오름차순으로 정렬
int count = 1; // 첫 번째 회의 선택
int lastEnd = v[0].first;
for (int i = 1; i < v.size(); i++) {
if (v[i].second >= lastEnd) { // 다음 회의가 현재 회의 끝난 이후에 시작한다면 선택
count++;
lastEnd = v[i].first;
}
}
cout << count << '\n';
return 0; // 프로그램 정상 종료
}
코드 설명
위 코드는 그리디 알고리즘을 사용하여 회의실에 최대한 많은 회의를 배정합니다.
- 입력 처리:
- 회의의 시작 시간과 끝나는 시간을 입력받아 `vector`에 저장합니다.
- 끝나는 시간을 기준으로 정렬하기 위해 `pair`의 첫 번째 요소에 끝나는 시간을 저장합니다.
- 정렬:
- `sort`를 사용하여 끝나는 시간을 기준으로 오름차순 정렬합니다.
- 그리디 선택:
- 가장 먼저 끝나는 회의를 선택합니다.
- 현재 회의의 끝나는 시간 이후에 시작하는 회의만 선택합니다.
시간 복잡도 분석:
- 정렬: O(n log n).
- 회의 선택: O(n).
전체 시간 복잡도는 O(n log n)으로 효율적으로 동작합니다.
결과
다음은 입력 예시와 출력 결과입니다:
입력:
5
1 4
2 3
3 5
5 7
6 8
출력:
3
회의실을 최대한 배정하여 총 3개의 회의를 열 수 있습니다.
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 그리디' 카테고리의 다른 글
백준 11399번 [ATM](C++) -yes6686- 티스토리 (0) | 2024.12.25 |
---|---|
백준 11047번 [동전 0](C++) -yes6686- 티스토리 (0) | 2024.12.25 |
백준 12788번 [제 2회 IUPC는 잘 개최될 수 있을까?](C++) -yes6686- 티스토리 (2) | 2024.11.13 |
백준 17262번 [팬덤이 넘쳐흘러](C++) -yes6686- 티스토리 (1) | 2024.09.28 |
백준 20365번 [블로그2](C++) -yes6686- 티스토리 (0) | 2024.09.10 |