[Leetcode 57] Insert

https://leetcode.com/problems/insert-interval/

기입

시작점으로 정렬된 모든 간격을 포함하는 2차원 int 배열입니다.

추가할 점을 포함하는 1차원 int 배열

누르다

새 간격이 추가될 때 겹치지 않는 간격을 포함하는 2D int 배열을 반환합니다.

기입

((1.3), (6.9)) (2.5)

누르다

((1.5), (6.9))

설명

https://thecosmos.21

(Leetcode 56) 병합 간격

간격이 모두 있는 2차원 배열 입력 2차원 배열 사이의 겹치는 간격을 합산하여 간격이 겹치지 않는 2차원 배열 입력 예 입력 ((1,3),(2,6),(8,10),(15 ,18)) 출력 ((1, 6), (8, 10), (15, 18)) (1,3

thecosmos.tistory.com

이전 문제의 코드를 재사용했습니다.

입력으로 주어진 2D 정렬 배열을 반복하고 간격을 확인합니다.

  • 간격의 시작이 입력으로 지정된 새 간격의 시작과 같거나 이후이면 새 간격이 그 앞에 삽입됩니다.

결합할 수 있는 간격은 간격 2D 배열을 통과할 때 병합되어 새 간격을 추가합니다.

암호

class Solution {
    func insert(_ intervals: ((Int)), _ newInterval: (Int)) -> ((Int)) {

        func merge(_ intervals: ((Int))) -> ((Int)) {

            var overlappingIntervals: ((Int)) = ()
            var temp: (Int) = ()
            for interval in intervals { 
                if temp.isEmpty {
                    temp += interval
                    continue
                }

                if temp.last! >= interval.first! {
                    let endPoint = temp.popLast()!
                    temp.append(max(endPoint, interval.last!))
                    continue
                }
                overlappingIntervals.append(temp)
                temp = interval
            }
            overlappingIntervals.append(temp)
            return overlappingIntervals

        }

        var newIntervals: ((Int)) = ()
		
        // 입력으로 주어진 2차원 배열이 비어있을 수도 있다.
        if intervals.isEmpty {
            newIntervals = (newInterval)
        } else {
            var index = 0
            while index < intervals.count { 
                let interval = intervals(index)
                if interval.first! >= newInterval.first! {
                    newIntervals.append(newInterval)
                    newIntervals.append(interval)
                    index += 1
                    // 새로 추가하려는 배열이 제일 끝이 아닐 때
                    newIntervals = newIntervals + intervals(index...)
                    return merge(newIntervals)
                    break
                }
                newIntervals.append(interval)
                index += 1 
            }
            // 새로 추가하려는 배열이 제일 뒤에 있을 수도 있다.
            newIntervals.append(newInterval)
        }
        return merge(newIntervals)
    }
}

다른 솔루션

위의 솔루션은 이전에 사용했던 코드를 재사용하고 싶었기 때문에 어떻게든 틀에 맞는 코드였습니다.

사실 그렇게 복잡할 필요는 없었습니다.

총 3단계를 거치면 쉽게 풀 수 있었습니다.

배열을 반복한다고 가정합니다.

1. 현재 구간의 시작점이 더할 구간의 시작점보다 작으면 배열에 추가하면 됩니다.

2. 현재 구간의 시작점이 추가할 구간의 끝점보다 작거나 같으면 중복 구간을 계산하여 추가할 구간으로 업데이트합니다.

3. 현재 간격의 시작점이 추가하려는 간격의 끝점보다 크면 배열에 추가하면 됩니다.

이 접근 방식을 사용하면 문제를 더 쉽게 해결할 수 있습니다.