개발 공부/Algorithm

[LeetCode] 435. Non-overlapping Intervals

maxlafe 2024. 12. 8. 21:18


435. Non-overlapping Intervals

 


Given an array of intervals intervals where intervals[i] = [starti, endi], return the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping.
Note that intervals which only touch at a point are non-overlapping. For example, [1, 2] and [2, 3] are non-overlapping.

 

 

1. 문제 상황

주어진 구간에서 겹치는 구간을 최소화하려면 몇 개의 구간을 제거해야 하는지 묻는 문제.

겹치지 않는 구간의 최대 개수를 유지하려면 어떤 구간을 선택하는 게 좋을까?

 

2.문제의 특성과 제한사항

구간은 [start, end] 형태

겹치지 않는 구간끼리 최대한 많이 유지하려면 겹치지 않는 기준을 찾아야하고

구간이 겹친다면 하나를 반드시 제거해야 함

 

3. 예시

intervals = [[1, 2], [1, 3], 2, 3], [3, 4]]

에서, 종료시간이 짧은 구간을 먼저 선태갛는 게 유리함.

예를 들어 [1, 3] 대신 [1, 2]를 선택하면 더 많은 구간을 유지할 수 있음!

 

class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        # 종료 시간을 기준으로 정렬
        intervals.sort(key=lambda x:x[1])

        result = 0
        # 종료 시간을 기억하는 변수에 -무한대로 초기화
        end = float('-inf')

        # 각 구간 순회
        for s, e in intervals:
            # 만약 시작 시간이 직전 종료 시간보다 작다면
            # 다음 시작 시간 < 직전 종료 시간이므로 겹침
            if s < end:
                result += 1
            # 그렇지 않을 경우엔 갱신
            else:
                end = e
        
        return result

 

4. 시간복잡도

정렬에 O(n logn) 이 필요

반복문 O(n)

총합 : O(n log n)