Divide Intervals Into Minimum Number of Groups

유승선 ·2022년 9월 15일
0

LeetCode

목록 보기
56/115

오랜만에 올려보는 글이다. 추석 연휴가 지나고 여러곳에 지원서를 넣느라 많이 연습을 못한게 느껴진다. 이제 결과를 기다리는 만큼 다가오는 코딩 테스트를 위해 공부 할 예정이다.

꽤 흔하게 보이는 Intervals 문제를 몸풀기로 풀어봤고 오랜만에 푼만큼 좀 고전했었다.

문제의 핵심은 서로 겹치지 않는 구간을 찾아내 최소한의 그룹으로 만들면 되는 문제이다.

예) [1,5], [6,8] O -> [1,5], [5,10] X

여기서 나는 우선정렬 큐로 구간을 모두 정렬 시켜준다음에 가장 순서에 맞게 pop 을 시켜주는 그리디한 방법을 생각했는데 내 풀이가 좀 잘 안맞아서 아쉬웠다.

내가 생각한 풀이 방법은 for 룹을 두번 쓰는 거랑 똑같았고 TLE 가 나올 수 밖에 없었기 떄문에 한번에 for 룹으로 답을 찾는 방법을 생각 못했다.

class Solution {
public:
    int minGroups(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end()); 
        priority_queue<int,vector<int>,greater<int>> pq; 
        pq.push(intervals[0][1]); 
        for(int i = 1; i < intervals.size(); i++){
            if(intervals[i][0] > pq.top()) pq.pop(); 
            pq.push(intervals[i][1]); 
        }
        return pq.size(); 
    }
};

답을 좀 참고 했고 위에가 내 풀이 방법을 for 룹 하나로 소화시킨 방법이다. 풀이가 좀 익숙 하다고 느꼈는데 백준에서 예전에 풀었던 최소 회의실 개수 랑 똑같은 풀이였다.

문제를 풀었던 시간이 꽤 지나기도 했고 많이 잊은거 같아 그때 풀어본 풀이를 다시 참고해서 내 실수를 알았다. 이번에도 정렬을 해주어서 가장 먼저 시작하는 시간이 앞으로 가게 만들었다. 후에는 끝나는 시간을 min_heap 에 담아서 가장 먼저 끝나는 시간을 계속 유지하고 겹치지 않는 구간이 나온다면 유지하고 있는 정보를 pop 해주면서 마지막에는 남아있는 size 로 답을 내주었다.

풀이 자체가 전에 풀었던 문제와 같기 때문에 추가적인 설명은 더 안하겠지만 비슷한 유형의 문제를 또 틀려서 굉장히 아쉬웠다.

배운점:
1. 똑같은 실수 하지말자
2. Interval 문제가 나온다면 앞으로는 쭉 참고하자

profile
성장하는 사람

0개의 댓글