[LeetCode] 352. Data Stream as Disjoint Intervals

Chobby·2025년 3월 25일
1

LeetCode

목록 보기
309/427

😎풀이

  1. 자잘한 것은 필요 없고 addNum에 집중한다.
  2. 연결 범위 자체가 없다면 시작 범위와 끝 범위를 모두 value로 설정한다([value, value])
  3. 현재 설정된 모든 범위를 순회하며 현재 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;
    }
}
profile
내 지식을 공유할 수 있는 대담함

0개의 댓글