[TypeScript] 자료 구조로 담아내기. #4 - 배열(with. 시프트)

이번 편은 이전 편으로부터 이어집니다.

삽입과 삭제를 수행할 때는 일정 구간을 밀어내거나 당겨오게 됩니다. 이러한 연산을 일반적으로 시프트라 부릅니다.

왼쪽 시프트

function shl(mem: any[], l: number, r: number): void {
    for(let i = l; i <= r; i++) { mem[i - 1] = mem[i]; }
}

왼쪽 시프트는 지정된 메모리 memlr로 지정된 범위를 왼쪽으로 한 칸 움직입니다. 이 경우, 기존에 l 위치 이전 요소는 덮어써집니다.

오른쪽 시프트

function shr(mem: any[], l: number, r: number): void {
    for(let i = r; i >= l; i--) { mem[i + 1] = mem[i]; }
}

오른쪽 시프트는 지정된 메모리 memlr로 지정된 범위를 오른쪽으로 한 칸 움직입니다. 이 경우, 기존에 r 위치 다음 요소는 덮어써집니다.

적용

class BasicArrayImpl<T> implements BasicArray<T> {
    insert(index: number, element: T): void {
        checkBounds(0, this.slots.length, index);
        this.slots.length++;
        shr(this.slots, index, this.slots.length - 2);
        this.slots[index] = element;
    }

    delete(index: number): T {
        checkBounds(0, this.slots.length - 1, index);

        const element = this.slots[index];
        shl(this.slots, index + 1, this.slots.length - 1);
        this.slots.length--;

        return element;
    }

    // ...
}

위 코드를 간략히 설명하겠습니다.

insert는 아래와 같이 수행됩니다.

  1. 확보할 추가 공간까지 고려하여 경계 검사.

  2. 추가 공간을 확보.

  3. index 위치부터 추가 공간을 제외한 경계까지 범위를 오른쪽으로 한 칸을 밀어냄.

  4. index 위치에 새 요소 설정

delete는 아래와 같이 수행됩니다.

  1. 경계 검사.

  2. 제거할 요소를 가져옴.

  3. index 다음 위치부터 경계까지 범위를 왼쪽으로 한 칸을 당겨옴.

  4. 잉여 공간을 반환.

  5. 제거한 요소를 반환.

내용은 다음 편에서 이어집니다. 읽어주셔서 감사합니다!

묻고 답하기

개인적인 판단에 의해 적절하다고 여겨지는 경우, 모두가 볼 수 있도록 이곳에 문답이 추가됩니다. 그렇지 않더라도 질문에 대한 답변은 별도로 이루어집니다.