
😎풀이
- 자잘한 것은 필요 없고
addNum
에 집중한다.
- 연결 범위 자체가 없다면 시작 범위와 끝 범위를 모두
value
로 설정한다([value, value])
- 현재 설정된 모든 범위를 순회하며 현재
value
가 속하거나 설정된 범위를 갱신할 수 있는지 확인한다.
3-1. 만약, value
가 속하지 않고 현재 시작 지점보다 작은 값이라면 이 지점 뒤에 value
를 입력한다.
3-2. 만약, value
가 특정 범위 내에 병합될 경우 앞의 모든 지점을 탐색하며 현재 병합된 지점과 추가 병합이 가능한지 탐색한다.
3-3. 아무 지점과도 병합되지 않았다면 최종 지점 이후에 현재 value
를 시작과 끝 범위로 입력한다.
class SummaryRanges {
private arr: number[][];
constructor() {
this.arr = [];
}
addNum(value: number): void {
if(this.arr.length === 0) {
this.arr.push([value, value]);
return;
}
let isConnect = false;
for(let i = 0; i < this.arr.length; i++) {
const [st, ed] = this.arr[i];
if(value >= st - 1 && value <= ed + 1) {
this.arr[i][0] = Math.min(value, st)
this.arr[i][1] = Math.max(value, ed)
isConnect = true
while(i + 1 < this.arr.length && this.arr[i][1] + 1 >= this.arr[i + 1][0]) {
this.arr[i][1] = Math.max(this.arr[i][1], this.arr[i + 1][1])
this.arr.splice(i + 1, 1)
}
break
}
if(value < st) {
this.arr.splice(i, 0, [value, value]);
isConnect = true;
break;
}
}
if(!isConnect) {
this.arr.push([value, value]);
}
}
getIntervals(): number[][] {
return this.arr;
}
}