본문 바로가기

Algorithm/BAEKJOON

[BOJ] 20126번 교수님의 기말고사 (C++)

728x90
반응형

https://www.acmicpc.net/problem/20126

 

20126번: 교수님의 기말고사

교수님이 시험을 시작할 수 있는 시각을 출력하여라. 시작 가능한 시각이 여러 개 있으면 그중 가장 앞선 시각을 출력한다. 시험을 치룰 수 없다면 -1을 출력하여라.

www.acmicpc.net

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	int n, m, s, x, y;
	vector<pair<int, int>> v;
	
	cin >> n >> m >> s;
	for(int i = 0; i < n; i++){
		cin >> x >> y;
		v.push_back({x, y});
	}
	
	sort(v.begin(), v.end());
	
	// 1. 앞쪽에 시간이 비는 경우
	if(v[0].first >= m){
		cout << 0 << endl;
		return 0;
	}
	
	// 2. 중간에 시간이 비는 경우
	int tmp = 0;
	for(int i = 0; i < n; i++){
		if(v[i].first - tmp >= m) {
			cout << tmp << endl;
			return 0;
		}
		tmp = v[i].first + v[i].second;
	}
    
	// 3. 뒤쪽에 시간이 비는 경우
	if(s - tmp >= m) cout << tmp << endl;
	else cout << -1 << endl;
	return 0;
}

 

시험이 시작하는 시간과 진행 시간을 쌍으로 벡터에 넣고 오름차순으로 정렬한다.

 

1. 앞쪽에 시간이 비는 경우

맨 처음 시작하는 시간이 m보다 같거나 크면 앞쪽에 시간이 비는 것이므로 0분부터 시험을 치를 수 있다.

 

2. 중간에 시간이 비는 경우

이전 시험이 끝나는 시간을 tmp로 두고 다음 시험이 시작하는 시간에서 tmp를 뺀 시간이 m보다 같거나 크면 시간이 비는 것이므로 tmp분부터 시험을 치를 수 있다.

 

3. 뒤쪽에 시간이 비는 경우

강의실을 이용할 수 있는 마지막 시간(s)에서 마지막 시험이 끝나는 시간(tmp)를 뺀 시간이 m보다 같거나 크면 뒤쪽에 시간이 비는 것이므로 tmp분부터 시험을 치를 수 있다. 

 

뒤쪽에도 시간이 비지 않는다면 시험을 치룰 수 없는 것이므로 -1을 출력한다.

728x90
반응형