LeetCode #56 Merge Intervals

ieunjung·2020년 11월 1일
0

https://leetcode.com/problems/merge-intervals/

문제 파악

Given a collection of intervals, merge all overlapping intervals.
주어진 간격 배열에서 겹치는 부분을 합쳐라.

예제 파악

Input: intervals = [[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] 에서 [3], [2] 부분이 겹치게 되는데, 결과적으로 [1,6] 로 합칠 수 있다.
그래서 다음을 큰 전제로 두고 답을 구해나갔다.
=> 이전 요소의 마지막 인덱스의 값3이 다음 요소의 첫번째 인덱스의 값2 보다 작으면 두 요소를 합친다.
그런데 이 하나로 끝날만큼 답이 단순하지는 않아서 예외 조건을 추가하느라 코드가 간단하게 만들어지지 않았다.
(오름차순 정렬, prevLastNum를 머지한 값의 마지막 인덱스 값이라 두는 것)

코드

/**
 * @param {number[][]} intervals
 * @return {number[][]}
 */
var merge = function (intervals) {
    // interval[0] 기준 오름차순 정렬
    intervals.sort((a, b) => {
        return a[0] - b[0];
    });

    let answer = []; // 
    let prevLastNum = 0; // answer의 바로 전 배열 객체의 [1]번째 인덱스의 값

    intervals.map((interval, idx) => {
        let [a, b] = interval;

        if (idx > 0 && prevLastNum >= a) {
            let prevA = answer[answer.length - 1][0],
                prevB = answer[answer.length - 1][1];

            if (prevB > b) {
                b = prevB;
            }
			
            // merge
            answer.pop();
            answer.push([prevA, b]);
        } else {
            answer.push(interval);
        }

        prevLastNum = answer[answer.length - 1][1]; // 이전 요소 마지막 인덱스값 리셋
    })

    return answer;
};
profile
Done is better than perfect

0개의 댓글