이 튜토리얼에서는 주어진 인덱스 범위에 포함된 배열 요소를 삭제하는 방법을 알아보겠습니다. 문제 해결 절차는 다음과 같습니다.
문제 해결 단계
- 배열과 삭제할 요소의 인덱스 범위를 초기화합니다.
- 새로운 인덱스 변수를 하나 선언합니다.
- 배열 전체를 순회하면서 다음 작업을 수행합니다.
- 현재 인덱스가 주어진 범위에 속하지 않으면, 해당 요소를 새 인덱스 위치로 이동시킵니다.
- 새 인덱스 값을 증가시킵니다.
- 순회가 끝나면 새 인덱스 값을 반환합니다. 이 값이 삭제 후 남은 배열의 길이가 됩니다.
이 방식의 핵심 아이디어는 실제로 메모리에서 요소를 지우는 것이 아니라, 범위 밖의 요소들만 앞쪽으로 당겨와 덮어쓰는 것입니다. C++의 기본 배열은 크기를 동적으로 줄일 수 없기 때문에, 유효한 데이터의 길이를 별도로 관리해야 한다는 점을 기억하세요. 시간 복잡도는 O(n)으로, 배열을 한 번만 순회하면 되므로 매우 효율적입니다.
예제 코드
전체 코드를 살펴보겠습니다.
#include <bits/stdc++.h>
using namespace std;
int deleteElementsInRange(int arr[], int n, int l, int r) {
int i, newIndex = 0;
for (i = 0; i < n; i++) {
// 주어진 범위에 포함되지 않는 경우에만 요소를 유지
if (i <= l || i >= r) {
arr[newIndex] = arr[i];
newIndex++;
}
}
// 갱신된 길이(새 인덱스)를 반환
return newIndex;
}
int main() {
int n = 9, l = 1, r = 6;
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int updatedArrayLength = deleteElementsInRange(arr, n, l, r);
for (int i = 0; i < updatedArrayLength; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
1 2 7 8 9
코드 설명
예제에서 배열은 {1, 2, 3, 4, 5, 6, 7, 8, 9}이며, l = 1, r = 6으로 설정했습니다. 조건문 i <= l || i >= r에 따라 인덱스 1 이하와 인덱스 6 이상인 요소만 유지되고, 그 사이의 요소(인덱스 2~5)는 제외됩니다. 따라서 값 3, 4, 5, 6이 삭제되고 최종적으로 1 2 7 8 9만 출력됩니다.
마무리
이번 튜토리얼에서는 두 개의 포인터(읽기 인덱스와 쓰기 인덱스)를 활용해 특정 범위의 배열 요소를 제거하는 방법을 배웠습니다. 추가 질문이 있다면 댓글로 남겨주세요!