티스토리 뷰
Question
Given an array of intervals where intervals[i] = [starti, endi], merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.
구간의 시작점과 끝점 정보가 담긴 배열들을 담고있는 배열이 주어졌을 때, 겹치는 구간을 모두 합쳐, 겹치는 구간이 없게 반환하라.
제약사항
- 1 <= intervals.length <= 10^4
- intervals[i].length == 2
- 0 <= starti <= endi <= 10^4
Solution
문제를 풀면서 고려한 사항
- [1,2] , [2,3] 두 구간이 주어졌을 때 [1,3] 이 합쳐져야 한다.
- [1,2] , [3,4] 는 연속된 구간이 아니다.
구간을 전부 점으로 찍는다고 생각하고, 점이 찍힌 구간을 연속된 구간이라고 판단하는 방법은 오류가 있다.
예를 들어 [1,3] [4,5] 구간일 때
1 2 3 이 찍히고 4 와 5가 찍혀 1,5를 연속된 구간이라 판단할 수 있지만, 아니기 때문에 다른 방법이 필요하다
가장 쉬운방법을 생각해보자.
Solution1 (Bruth Force)
새로운 구간이 입력될 때마다 각 구간에 겹치는 부분이 있다면 갱신해주는 방식을 생각해보자
예로 주어진 [[1,3],[2,6],[8,10],[15,18]] 구간에서
[1,3] : 첫 행 입력으로 바로 넣어줌
[2,6] : [1,3] 과 비교 후 겹치기 때문에 갱신 [1,6]
[8,10] : [1,6] 과 비교 후 겹치지 않기 때문에 넣어줌
[15,18] : [1,6] 및 [8,10]과 비교 후 겹치지 않기 때문에 넣어줌.
이런 방식이라면, 주어진 구간의 개수가 N일 때 비교에 N * N-1 * N-2 = O(N!)이다.
이 방식은 주의할 점이, 원래 겹치는 구간이 없었던 구간들이, 갱신 후 겹쳐질 수 있기 때문이다. 그 부분까지 고려를 해야 한다.
Solution2
하지만 만약 주어진 구간이 시작점을 기준으로 정렬된 구간이라고 가정을 한다면, 겹치는 작업을 해줄 때 갱신 후 겹쳐질 걱정은 하지 않아도 된다.
또한 정렬되어 있기 때문에 모든 구간을 기준으로 검색 하기 보다 마지막 구간을 기준으로 작업을 해주면 된다.
예를 들어 아래와 같이 구간이 주어졌다고 한다면
[1,9], [2,5], [19,20], [10,11], [12,20], [0,3] [0,1] [0,2]
이를 start를 기준으로 정렬 한다면 아래와 같이 된다.
[0,3] [0,1] [0,2] [1,9], [2,5] [10,11] [12,20] , [19,20]
이 구간을 기준으로 합쳐주는 작업을 해주면 위의 고려사항들을 고려하지 않아도 된다.
[0,3] <- [0,3]
[0,3] <- [0,1]
[0,3] <- [0,2]
[0,9] <- [1,9]
[0,9] <- [2,5]
[0,9],[10,11] <- [10,11]
[0,9], [10,11], [12,20] <- [12,20]
[0,9], [10,11], [12,20], [19,20] <- [19,20]
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> merged;
sort(intervals.begin(), intervals.end());
for(auto interval : intervals){
if(merged.empty() || merged.back()[1] < interval[0]){
merged.push_back(interval);
}
else{
merged.back()[1] = max(merged.back()[1], interval[1]);
}
}
return merged;
}
};
시간 복잡도는 정렬을 위한 시간복잡도 O(nlogn) + interval 순회를 위한 O(n) 합쳐서 O(nlogn)이다.
- Time complexity : O(nlogn) , 정렬을 위한 시간 복잡도 O(nlogn) + interval 순회를 위한 O(n)
- Space Complexity : O(logn), 정렬을 in- place에서 할 수 있다면 O(1)이다.
출처 : https://leetcode.com/problems/merge-intervals/
'IT > Problem Solving' 카테고리의 다른 글
[C++] LeetCode : Happy Number (0) | 2022.08.14 |
---|---|
[C++] LeetCode : Factorial Trailing Zeros (0) | 2022.08.14 |
[C++] LeetCode : Longest Palindromic Substring (0) | 2022.08.10 |
[C++] Leetcode : Word Search (0) | 2022.08.02 |
[C++] LeetCode : Subsets (0) | 2022.08.01 |
- Total
- Today
- Yesterday
- 맛집
- 러스트 배우기
- 기술면접
- 속초 맛집
- 러스트 입문
- 코딩인터뷰
- interview question
- 자료구조
- 알고리즘
- 내돈내산
- PS
- coding interview
- 속초
- LeetCode
- C++
- Medium
- 솔직후기
- Problem Solving
- rust
- 인터뷰
- Tree
- 러스트 기초
- ProblemSolving
- Interview
- DP
- 리트코드
- 트리
- 러스트
- algorithm
- 반드시 알아야 할 자료구조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |