Skip to content

Commit 11bd72a

Browse files
committed
solve: insert interval
1 parent 676d5c2 commit 11bd72a

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

insert-interval/wogha95.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/**
2+
* TC: O(N)
3+
* 1번에서 N만큼 순회
4+
* 2번에서 최대 N만큼 순회
5+
*
6+
* SC: O(1)
7+
* 겹치는 interval의 시작, 끝 index를 저장하는 변수만 사용
8+
*
9+
* N: intervals.length
10+
*/
11+
12+
/**
13+
* @param {number[][]} intervals
14+
* @param {number[]} newInterval
15+
* @return {number[][]}
16+
*/
17+
var insert = function (intervals, newInterval) {
18+
if (intervals.length === 0) {
19+
return [newInterval];
20+
}
21+
if (newInterval[1] < intervals[0][0]) {
22+
return [newInterval, ...intervals];
23+
}
24+
if (intervals[intervals.length - 1][1] < newInterval[0]) {
25+
return [...intervals, newInterval];
26+
}
27+
28+
// 1. 겹치는 interval의 시작, 끝 index를 구한다.
29+
let overLappingStartIndex = intervals.length - 1;
30+
let overLappingEndIndex = 0;
31+
for (let index = 0; index < intervals.length; index++) {
32+
const interval = intervals[index];
33+
if (
34+
(interval[0] <= newInterval[0] && newInterval[0] <= interval[1]) ||
35+
newInterval[0] < interval[0]
36+
) {
37+
overLappingStartIndex = Math.min(overLappingStartIndex, index);
38+
}
39+
if (
40+
(interval[0] <= newInterval[1] && newInterval[1] <= interval[1]) ||
41+
interval[1] < newInterval[1]
42+
) {
43+
overLappingEndIndex = Math.max(overLappingEndIndex, index);
44+
}
45+
}
46+
47+
// 2.
48+
// 시작index 전까지 모두 추가하고
49+
// 시작index, 끝index의 최대 범위 interval을 추가하고
50+
// 끝index 이후 interval을 모두 추가한다.
51+
const result = [];
52+
for (let index = 0; index < overLappingStartIndex; index++) {
53+
result.push(intervals[index]);
54+
}
55+
const overLappedStart = Math.min(
56+
intervals[overLappingStartIndex][0],
57+
newInterval[0]
58+
);
59+
const overLappedEnd = Math.max(
60+
intervals[overLappingEndIndex][1],
61+
newInterval[1]
62+
);
63+
result.push([overLappedStart, overLappedEnd]);
64+
for (let index = overLappingEndIndex + 1; index < intervals.length; index++) {
65+
result.push(intervals[index]);
66+
}
67+
68+
return result;
69+
};

0 commit comments

Comments
 (0)