Grind75
문제로

풀이2

 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
class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        List<int[]> result = new ArrayList<>();
        int i = 0;
        int n = intervals.length;

        // 새로운 구간의 시작 이전에 있는 구간들을 결과에 추가
        while (i < n && intervals[i][1] < newInterval[0]) {
            result.add(intervals[i]);
            i++;
        }

        // 새로운 구간과 겹치는 구간들을 병합
        while (i < n && intervals[i][0] <= newInterval[1]) {
            newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
            newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
            i++;
        }
        result.add(newInterval);

        // 새로운 구간의 끝 이후에 있는 구간들을 결과에 추가
        while (i < n) {
            result.add(intervals[i]);
            i++;
        }

        return result.toArray(new int[result.size()][]);
    }
}

image

풀이방법

구간 분류:

newInterval을 삽입하기 전에 intervals를 세 가지 범주로 분류합니다:

  • newInterval의 시작 이전에 있는 구간.
  • newInterval과 겹치는 구간.
  • newInterval의 끝 이후에 있는 구간.

구간 병합:

newInterval과 겹치는 구간들을 병합합니다. 병합된 새로운 구간의 시작은 newInterval과 겹치는 구간 중 가장 작은 시작값이고, 병합된 새로운 구간의 끝은 newInterval과 겹치는 구간 중 가장 큰 끝값입니다.

결과 반환:

세 범주로 분류된 구간들을 순서대로 합쳐서 결과를 반환합니다.