이번 편은 이전 편으로부터 이어집니다.
삽입과 삭제를 수행할 때는 일정 구간을 밀어내거나 당겨오게 됩니다. 이러한 연산을 일반적으로 시프트라 부릅니다.
왼쪽 시프트
function shl(mem: any[], l: number, r: number): void {
for(let i = l; i <= r; i++) { mem[i - 1] = mem[i]; }
}
왼쪽 시프트는 지정된 메모리 mem
중 l
과 r
로 지정된 범위를 왼쪽으로 한 칸 움직입니다. 이 경우, 기존에 l
위치 이전 요소는 덮어써집니다.
오른쪽 시프트
function shr(mem: any[], l: number, r: number): void {
for(let i = r; i >= l; i--) { mem[i + 1] = mem[i]; }
}
오른쪽 시프트는 지정된 메모리 mem
중 l
과 r
로 지정된 범위를 오른쪽으로 한 칸 움직입니다. 이 경우, 기존에 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
는 아래와 같이 수행됩니다.
확보할 추가 공간까지 고려하여 경계 검사.
추가 공간을 확보.
index
위치부터 추가 공간을 제외한 경계까지 범위를 오른쪽으로 한 칸을 밀어냄.index
위치에 새 요소 설정
delete
는 아래와 같이 수행됩니다.
경계 검사.
제거할 요소를 가져옴.
index
다음 위치부터 경계까지 범위를 왼쪽으로 한 칸을 당겨옴.잉여 공간을 반환.
제거한 요소를 반환.
내용은 다음 편에서 이어집니다. 읽어주셔서 감사합니다!
묻고 답하기
개인적인 판단에 의해 적절하다고 여겨지는 경우, 모두가 볼 수 있도록 이곳에 문답이 추가됩니다. 그렇지 않더라도 질문에 대한 답변은 별도로 이루어집니다.