Merge Intervals
구간은 시작과 끝이 있는 정수의 범위입니다. 하나 이상의 점을 공유하는 구간은 하나로 합치며, 서로 맞닿기만 하는 구간도 마찬가지입니다. [1, 4]와 [4, 5]는 [1, 5]가 됩니다. 목표는 서로 겹치는 모든 구간 그룹을 그 그룹 전체를 포함하는 하나의 구간으로 바꾸는 것입니다.
핵심은 순서입니다. 구간을 시작점 기준으로 정렬하면, 만들고 있는 구간과 겹치는 구간은 바로 뒤에 옵니다. 정렬된 목록을 차례로 살펴보며 마지막으로 병합한 구간을 유지합니다. 다음 구간의 시작점이 현재 구간의 끝점 이하이면 끝점을 늘리고, 그렇지 않으면 실제 간격이 있으므로 새 구간을 시작합니다. 정렬에는 O(n log n)이 걸리고, 목록을 살펴보는 과정은 한 번만 수행됩니다.
mergeIntervals라는 이름의 함수를 작성하세요. 이 함수는 두 정수 배열 starts와 ends를 입력받아 병합된 구간을 반환합니다.
여기서는 모든 언어가 2차원 배열을 입력으로 받는 것을 지원하지 않으므로 구간은 두 배열로 주어집니다. 구간 i는 [starts[i], ends[i]]이며, 두 배열의 길이는 같습니다. 구간은 정렬되어 있지 않습니다.
겹치는 모든 구간을 병합하세요. 끝점에서만 맞닿는 구간도 겹치는 것으로 간주합니다. 병합된 구간을 시작점 기준으로 정렬된 2차원 배열 [[start, end], ...]로 반환하세요.
예를 들어, starts = [5, 1, 12, 3]과 ends = [7, 4, 14, 6]은 [5, 7], [1, 4], [12, 14], [3, 6]을 나타내며, 이 구간들은 병합되어 [[1, 7], [12, 14]]가 됩니다.
제약 조건: 1 <= starts.length == ends.length <= 10^4, 0 <= starts[i] <= ends[i] <= 10^4.
함수
- arg1integer-array
- arg2integer-array
- 반환값integer-2d-array
예제
- 입력
- arg1 = [5, 1, 12, 3]arg2 = [7, 4, 14, 6]
- 출력
- [[1, 7], [12, 14]]
- 입력
- arg1 = [6, 1]arg2 = [9, 6]
- 출력
- [[1, 9]]
제출 시 숨은 테스트 +12개
힌트
하나씩 열어 보세요. 열 때마다 조금 더 알려 줍니다.
먼저 모든 시작점을 끝점과 짝지어, 두 개의 개별 배열 대신 전체 구간을 다루세요.
구간을 시작 위치를 기준으로 정렬하세요. 그러면 각 구간은 바로 앞의 그룹과만 겹칠 수 있으며, 그보다 더 앞에 있는 그룹과는 겹치지 않습니다.
- 마지막으로 병합된 구간을 유지하면서 정렬된 구간을 순회합니다. 다음 구간의 시작이 해당 구간의 끝보다 작거나 같으면, 두 끝값 중 더 큰 값으로 해당 구간의 끝을 설정합니다. 그렇지 않으면 해당 그룹이 끝난 것이므로 다음 구간에서 새 그룹을 시작합니다.
이 문제의 전체 풀이가 곧 추가됩니다.
비슷한 문제
같은 아이디어를 쓰는 문제입니다. 두세 개를 풀면 패턴이 몸에 익습니다.
Python
def mergeIntervals(starts, ends):
# 여기에 코드를 작성하세요케이스 1
케이스 2
입력
arg1 = [5, 1, 12, 3] arg2 = [7, 4, 14, 6]
기대값
[[1, 7], [12, 14]]