PS/BaekJoon

[BaekJoon 11000번] 강의실 배정(C++)

박땅콩 2022. 8. 22.
728x90

※주의※

저의 풀이가 정답은 아닙니다.

다른 코드가 더 효율적이거나 좋을 수 있습니다.

언제나 다른 사람의 코드는 참고만 하시기 바랍니다.

 

 

[문제 풀이 사이트]

 

 

 

11000번: 강의실 배정

첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109)

www.acmicpc.net

 

 

[문제 설명]

 

 

수강신청의 마스터 김종혜 선생님에게 새로운 과제가 주어졌다. 
김종혜 선생님한테는 Si에 시작해서 Ti에 끝나는 N개의 수업이 주어지는데, 최소의 강의실을 사용해서 모든 수업을 가능하게 해야 한다. 
참고로, 수업이 끝난 직후에 다음 수업을 시작할 수 있다. (즉, Ti ≤ Sj 일 경우 i 수업과 j 수업은 같이 들을 수 있다.)
수강신청 대충한 게 찔리면, 선생님을 도와드리자!

 

 

[입력]

 

 

첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000)

이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109)

 

 

[출력]

 

 

강의실의 개수를 출력하라.

 

 

[입출력 예]

 

 

입력 출력
3
1 3
2 4
3 5
2

 

 

[문제 풀이]

 

 

처음에 대충 읽고 회의실 배정 문제랑 비슷한 줄 알고 똑같이 코드를 짰다가 틀렸다

(대충 읽지말고 제발 꼼꼼히 읽자!)

 

그래서 자세히 문제를 읽어보니

문제의 핵심

1. 주어진 모든 강의를 소화해야한다.

2. 최소한의 강의실을 사용한다.

 

그래서 최소한의 강의실을 사용하기 위해

입력 받은 모든 강의를 시작 시간을 기준으로 오름 차순 정렬 했다.

 

입출력 예시로 설명하자면

{{1, 3} {2, 4} {3, 5}} 와 같이 정렬 된다.

 

그리고 주어진 강의를 강의실에 배치해야하는데 여기서 우선 순위 큐(최소 힙)사용했다.

(문제 분류가 우선 순위 큐를 사용하라고 써져 있어서 우선 순위 큐를 활용했다.)

여기서 우선 순위 큐는 강의실이라고 생각했고, 우선 순위 큐에는 강의의 끝나는 시간을 넣었다.

 

처음 우선 순위 큐(강의실)은 비어있으므로 시작 시간이 가장 빠른 강의 {1, 3}이 먼저 시작된다.

그래서 우선 순위 큐(강의실)에는 끝나는 시간인 3을 넣는다.

 

 

현재 진행 중인 강의의 끝나는 시간이, 다음 강의 시작 시간보다 큰 경우

➜ 새로운 강의실 개설이 필요하다. 

그래서 우선 순위 큐(강의실)에 다음 강의의 끝나는 시간 4를 넣어준다.

 

여기서 우선 순위 큐는 최소 힙이기 때문에 3, 4로 정렬되어 있다.

 

다음은 {3, 5}인데

현재 진행 중인 강의의 끝나는 시간이, 다음 강의 시작 시간보다 같거나 작은 경우

➜ 이어서 강의가 가능하다.

그래서 우선 순위 큐(강의실)에  현재 강의 3을 빼주고, 다음 강의의 끝나는 시간 5를 넣어준다.

 

 

그렇게 반복문이 마무리 되고,

우선 순위 큐(강의실)의 size가 강의실 개수라고 할 수 있다.

 

 

[최종 코드]

 

 

[GitHub]

 

 

 

GitHub - SmallPeanutPark/BAEKJOON: Study BaekJoon for Coding Test

Study BaekJoon for Coding Test. Contribute to SmallPeanutPark/BAEKJOON development by creating an account on GitHub.

github.com

 

 

#include <bits/stdc++.h>
using namespace std;

vector<pair<int, int>> lecture;
priority_queue<int, vector<int>, greater<int>> lectureroom;

int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int N; cin >> N;
    for(int i = 0; i < N; ++i) {
        int start, end;
        cin >> start >> end;
        lecture.push_back({start, end});
    }
    sort(lecture.begin(), lecture.end());

    int endtime = 0;
    for(int i = 0; i < N; ++i) 
    {
       if(lectureroom.empty()) {
            // 강의 진행 전
            lectureroom.push(lecture[i].second); // 끝나는 시간
       } else {
            // 강의 진행 중

            // 현재 강의의 끝나는 시간이 다음 강의 시작시간 보다 큰 경우
            if(lectureroom.top() > lecture[i].first) {
                // 새로운 강의실을 개설한다.
                lectureroom.push(lecture[i].second);
            } else if(lectureroom.top() <= lecture[i].first) {
                // 현재 강의의 끝나는 시간이 다음 강의 시작시간보다  작거나 같은 경우 이어서 강의 가능
                lectureroom.pop();
                lectureroom.push(lecture[i].second);
            }
       }
    }

    cout << lectureroom.size();
}

 

 

728x90

'PS > BaekJoon' 카테고리의 다른 글

[BaekJoon 11779번] 최소비용 구하기 2(C++)  (0) 2022.08.25
[BaekJoon 1753번] 최단경로(C++)  (0) 2022.08.22
[BaekJoon 11399번] ATM(C++)  (0) 2022.08.21
[BaekJoon 2217번] 로프(C++)  (0) 2022.08.21
[BaekJoon 1026번] 보물(C++)  (0) 2022.08.21

댓글