LeetCode의 문제와 유저들이 등록한 코드 중 득표수가 가장 높은 코드 분석

 

Given a collection of intervals, merge all overlapping intervals.

시작점과 끝점이 있는 숫자 쌍의 리스트 중 겹치는 부분이 있는 것을 병합하기

 

Example 1:

Input: [[1,3], [2,6], [8,10], [15,18]]

Output: [[1,6], [8,10], [15,18]]

Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].

[1,3]과  [2,6] 은 [1,6]로 병합

 

Example 2:

Input: [[1,4], [4,5]]

Output: [[1,5]]

Explanation: Intervals [1,4] and [4,5] are considered overlapping.

[1,4]과 [4,5]는 [1,5]로 병합

 

class Solution {
    public int[][] merge(int[][] intervals) {
        if (intervals.length <= 1)
            return intervals;
            
        // Sort by ascending starting point
        Arrays.sort(intervals, (i1, i2) -> Integer.compare(i1[0], i2[0]));

        List<int[]> result = new ArrayList<>();
        int[] newInterval = intervals[0];
        result.add(newInterval);
        for (int[] interval : intervals) {
            if (interval[0] <= newInterval[1]) // Overlapping intervals, move the end if needed
                newInterval[1] = Math.max(newInterval[1], interval[1]);
            else {                             // Disjoint intervals, add the new interval to the list
                newInterval = interval;
                result.add(newInterval);
            }
        }

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

 

풀이 방법

 

1. intervals 배열을 시작점이 작은 순서대로 정렬한 뒤 처음에 위치한 숫자 쌍을 기준값으로 설정한다. 

2. intervals 배열을 반복문을 돌면서 나오는 숫자 쌍의 시작점과 기준값의 종료점을 비교한다. 

3. 값의 비교

  3-1.  기준값의 종료점이 더 크거나 같은 경우

    - 범위가 겹치는 경우 이므로 종료점이 더 큰 것을 추출하여 기준값을 재정의 한다. 

    - ex) 기준값: [1,2], 비교대상 [1,3]인 경우

  3-2. 기준값의 종료점이 더 작은 경우

    - 범위가 겹치지 않는 경우 이므로 기준값과 비교한 숫자 쌍을 새로운 기준값으로 정의하고 결괏값을 저장하는 리스트에도 추가한다.

    - ex) 기준값: [1,6], 비교대상 [14,16]인 경우

 

 

코드 동작 확인

 

Input: [[2,6], [1,3], [8,10], [15,18]]

 

1. intervals 배열을 시작점이 작은 순서대로 정렬

- [[2,6], [1,3], [8,10], [15,18]][1,3], => [[1,3], [2,6], [8,10], [15,18]]

2. 결괏값을 담을 리스트를 생성 후 정렬한 intervals 배열의 처음에 위치한 값으로 설정

- [[1,3]]

3. intervals 배열을 루프 돌면서 엘리먼트들의 시작점이 기준값의 끝점보다 작거나 같은지 비교

 

최초

> newInterval = [1,3]

> intervals =  [[1,3], [2,6], [8,10], [15,18]]
> result = [[1,3]]

 

루프 1차 비교 

> newInterval = [1,3]

> interval =  [1,3]

> result = [[1,3]]

[1] <= [3]   interval의 시작점이 newInterval의 끝점보다 작기 때문에 newInterval [1] = Math.max(3, 3) 

> newInterval = [1,3]으로 변화 없음

 

루프 2차 비교 

> newInterval = [1,3]

> interval =  [2,6]

> result = [[1,3]]

[2] <= [3]   interval의 시작점이 newInterval의 끝점보다 작기 때문에 newInterval [1] = Math.max(3, 6) 

> newInterval = [1,6]

> result = [[1,6]]

 

루프 3차 비교 

> newInterval = [1,6]

> interval =  [8,10]

> result = [[1,6]]

[8] <= [6]  interval의 시작점이 newInterval의 끝점보다 크기 때문에 newInterval =  [8,10]

> newInterval = [8,10]

> result = [[1,6][8,10]]

 

루프 4차 비교 

> newInterval = [1,10]

> interval =  [15,18]

> result = [[1,6][8,10]]

[15] <= [10]   interval의 시작점이 newInterval의 끝점보다 크기 때문에 newInterval [1] = Math.max(10, 18) 

> newInterval = [1,10]

> result = [[1,6][8,10], [15,18]]

 

종료

 

'LeedCode' 카테고리의 다른 글

[LeedCode] 617. Merge Two Binary Trees  (0) 2019.11.29
[LeetCode] 139. Word Break  (0) 2019.11.14
블로그 이미지

kyungseop

공부한 내용 정리

,