정렬되어 있고 연속되지 않는 구간 배열 intervals
새로 주어지는 구간 newInterval이 들어왔을 때
합쳐질 수 있는 구간을 합쳐서 다시 전체 배열 반환
/**
* @param {number[][]} intervals
* @param {number[]} newInterval
* @return {number[][]}
*/
var insert = function(intervals, newInterval) {
if (!intervals.length)
return [newInterval];
let start = 0;
let end = 0;
for (start; start < intervals.length; start++) {
if (intervals[start][1] >= newInterval[0])
break ;
}
if (start === intervals.length) {
intervals.push(newInterval);
return intervals;
}
for (end = start; end < intervals.length; end++) {
if (intervals[end][0] > newInterval[1])
break ;
}
let newStart = Math.min(intervals[start][0], newInterval[0]);
let newEnd = intervals[end - 1] ?
Math.max(intervals[end - 1][1], newInterval[1]) : newInterval[1];
intervals.splice(start, end - start, [newStart, newEnd]);
return intervals;
};
빈 구간 배열이 주어졌을 경우 새 구간만 넣어서 반환
가장 먼저 새로운 구간이 들어갈 수 있는 위치를 파악
특정 구간의 종료점이 새 구간의 시작점보다 크다면
새 구간이 그 앞 또는 그 안에 들어갈 수 있으므로 시작점으로 지정
만약 모든 배열을 돌았는데도 모두 작다면 맨 마지막에 혼자 들어가면 되므로
맨 뒤에 push 해주고 원래 배열 반환
그 외에는 특정 구간의 시작점이 새 구간의 종료점보다 작은 위치를 구함
해당 구간의 앞 부분에 새 구간이 위치하므로 start부터 end - 1까지 병합됨
병합된 구간의 값을 구하기 위해 시작점은 둘 중 min인 값, 종료점은 둘 중 max인 값 선택
기존 배열에서 start-end를 잘라내고 새 구간을 넣어서 반환
Accepted
Runtime 75ms (Beats 55.02%)
Memory 54.27MB (Beats 50.05%)
처음에는 start를 구한 이후에 바로 반환할 수 있는 지 판단하지 않고 쭉 구했는데, 결과가 맘에 안들어서 다른 방법을 구하다가 약간 이리저리 방황했다. 그러다가 저 방법을 생각해내서 바꾸었고, 깔끔하진 않지만 결과는 만족이다. 헷갈렸던 이유가 이전 문제에서는 [1,2][2,3]이 있으면 [1,3]으로 병합할 수 있었는데 이번에는 그게 아니었다. 그리고 단순히 새 구간이 껴서 병합하는 경우가 아닌 새 구간이 모든 구간을 덮을 수 있는 상태거나 [0,0]이 들어온다거나 하는 일 때문에 모든 걸 포괄해서 조건을 깔끔하게 표현하는게 어려웠다. 코드 설명도 나름대로 열심히는 적어봤지만 아마 처음보는 사람은 이해하기 어려울 것 같아서 조금 아쉽다.