Programming/Coding Problems

LeetCode - 253. Meeting Rooms II

귤귤나무 2024. 11. 13. 13:52

비슷한 문제로 프로그래머스에 있는.. 그 기능개발 문제가 생각났다.

근데 그때는 시간 단위가 작았던 것 같아서 시간을 1씩 증가시키면서 반복문을 돌아서 조건 체크를 했다.

이번 문제는 좀 다른 방식으로 접근했다.

처음에 들었던 생각은..

1. 일단은 시작 시간 순서로 오름차순으로 정렬해야겠다!

2. 그런 다음에 방 개수를 저장하듯이 배열에 각 회의의 끝나는 시간을 저장해야겠다.

3. 단 끝나는 시간도 오름차순으로 정렬해야겠다!

4. 다음 회의가 들어오면 그 회의의 시작 시간과, 이미 진행중인 회의들의 끝나는 시간 중 가장 작은 시간을 비교해서 pop/push하기

class Solution {
public:
    int minMeetingRooms(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end());
        priority_queue<int, vector<int>, greater<int>> min_end;
        min_end.push(intervals[0][1]);
        int max_size = 1;
        for (int i = 1; i < intervals.size(); i++) {
            vector<int> cur = intervals[i];
            if (min_end.top() <= cur[0]) {
                while(!min_end.empty() && min_end.top() <= cur[0]) {
                    min_end.pop();
                }
                min_end.push(cur[1]);
            } else {
                min_end.push(cur[1]);
                if (max_size < min_end.size())
                    max_size = min_end.size();
            }
        }
        return max_size;
    }
};

priority_queue를 사용해서 끝나는 시간을 오름차순으로 정렬했다.

 

한 가지 디버깅하면서 찾은 부분은, 

문제에 나와있는 2가지 테스트 케이스 외에, 만약 (현재 진행중인 회의들의 끝나는 시간) < (들어오는 회의의 시작 시간)을 만족하는 진행중인 회의들이 여러 개 있을 수 있다.

예를 들어.. [1, 3], [2, 3], [3, 4]. 이럴 경우 priority_queue에서 pop을 2번 한 후 4를 삽입해야 한다.

이 반례를 만족하기 위해 첫 if문 안에 while문을 넣어 pop을 하도록 해야 한다.

이 부분은 처음부터 생각을 했는데, 밑에 케이스를 생각 못 했다.

 

만약 pop을 여러 번 하면, 다음 턴에서 새로운 회의가 들어와도 max_size는 바뀌지 않을 것이다.

예를 들어, 위의 케이스에서 [1, 3], [2, 3], [3, 4], [3, 5] 이렇게 들어왔다고 치자.

[3,4]가 들어오는 순가 기존에 priority_queue에 있던 [1, 3], [2, 3]을 pop해야 한다.

그러고 [3, 4]가 들어와서 현재 priority_queue의 크기가 1로 줄어든다. 하지만 이미 max_size는 이전에 [1, 3], [2, 3]에서 2로 설정되어 있었어서 새로운 회의를 추가해도 max_size는 변경 안 해도 된다.

그래서 두 번째 if문에서 priority_queue의 크기보다 max_size가 더 작을 경우에만 max_size를 변경하도록 했다.