|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: (Leetcode) 435 - Non-overlapping Intervals 풀이 |
| 4 | +categories: [스터디-알고리즘] |
| 5 | +tags: |
| 6 | + [자바, java, 리트코드, Leetcode, 알고리즘, interval, array, greedy, sorting] |
| 7 | +date: 2024-07-23 04:30:00 +0900 |
| 8 | +toc: true |
| 9 | +--- |
| 10 | + |
| 11 | +기회가 되어 [달레님의 스터디](https://github.com/DaleStudy/leetcode-study)에 참여하여 시간이 될 때마다 한문제씩 풀어보고 있다. |
| 12 | + |
| 13 | +[https://neetcode.io/practice](https://neetcode.io/practice) |
| 14 | + |
| 15 | +--- |
| 16 | + |
| 17 | +[https://leetcode.com/problems/non-overlapping-intervals/description/](https://leetcode.com/problems/non-overlapping-intervals/description/) |
| 18 | + |
| 19 | +## 내가 작성한 풀이 |
| 20 | + |
| 21 | +먼저 입력으로 들어온 intervals를 정렬 한다. |
| 22 | +interval 간에 overlapping이 발생된 경우 end 값이 짧은 쪽을 택한다. 그래야 추후에 더 많은 interval을 선택할 수 있다. |
| 23 | + |
| 24 | +```java |
| 25 | +public int eraseOverlapIntervals(int[][] intervals) { |
| 26 | + int overlappingCount = 0; |
| 27 | + Arrays.sort(intervals, Comparator.comparingInt(o -> o[1])); |
| 28 | + |
| 29 | + for (int i = 0; i < intervals.length - 1; i++) { |
| 30 | + // overlapping 이 발생된 경우 |
| 31 | + if (intervals[i][1] > intervals[i + 1][0]) { |
| 32 | + overlappingCount++; |
| 33 | + |
| 34 | + // 앞 interval 의 end 값이 뒤 interval 의 end 보다 작을 경우 swap |
| 35 | + if (intervals[i][1] < intervals[i + 1][1]) { |
| 36 | + int[] temp = intervals[i]; |
| 37 | + intervals[i] = intervals[i + 1]; |
| 38 | + intervals[i + 1] = temp; |
| 39 | + } |
| 40 | + } |
| 41 | + } |
| 42 | + |
| 43 | + return overlappingCount; |
| 44 | +} |
| 45 | +``` |
| 46 | + |
| 47 | +### TC, SC |
| 48 | + |
| 49 | +시간 복잡도는 `O(n*logn)` 공간 복잡도는 `O(1)` 이다. |
| 50 | + |
| 51 | +## swap 없이 pointer를 사용하여 풀기 |
| 52 | + |
| 53 | +첫번째 풀이는 swap이 필요하다. pointer를 통해서 개선할 수 있을 것으로 보여서 개선해보았다. |
| 54 | + |
| 55 | +```java |
| 56 | +public int eraseOverlapIntervals(int[][] intervals) { |
| 57 | + int overlappingCount = 0; |
| 58 | + Arrays.sort(intervals, Comparator.comparingInt(o -> o[1])); |
| 59 | + |
| 60 | + int currentEnd = intervals[0][1]; |
| 61 | + for (int i = 0; i < intervals.length - 1; i++) { |
| 62 | + // overlapping 이 발생된 경우 |
| 63 | + if (currentEnd > intervals[i + 1][0]) { |
| 64 | + overlappingCount++; |
| 65 | + |
| 66 | + // 앞 interval 의 end 값이 뒤 interval 의 end 보다 작을 경우 이전 pointer 유지 |
| 67 | + if (currentEnd < intervals[i + 1][1]) { |
| 68 | + continue; |
| 69 | + } |
| 70 | + } |
| 71 | + |
| 72 | + currentEnd = intervals[i + 1][1]; |
| 73 | + } |
| 74 | + |
| 75 | + return overlappingCount; |
| 76 | +} |
| 77 | +``` |
| 78 | + |
| 79 | +### TC, SC |
| 80 | + |
| 81 | +시간 복잡도는 `O(n*logn)` 공간 복잡도는 `O(1)` 이다. |
0 commit comments