Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 배열에서 인덱스 범위 [L – R]에 해당하는 요소 삭제하기

이 튜토리얼에서는 주어진 인덱스 범위에 포함된 배열 요소를 삭제하는 방법을 알아보겠습니다. 문제 해결 절차는 다음과 같습니다.

문제 해결 단계

  • 배열과 삭제할 요소의 인덱스 범위를 초기화합니다.
  • 새로운 인덱스 변수를 하나 선언합니다.
  • 배열 전체를 순회하면서 다음 작업을 수행합니다.
    • 현재 인덱스가 주어진 범위에 속하지 않으면, 해당 요소를 새 인덱스 위치로 이동시킵니다.
    • 새 인덱스 값을 증가시킵니다.
  • 순회가 끝나면 새 인덱스 값을 반환합니다. 이 값이 삭제 후 남은 배열의 길이가 됩니다.

이 방식의 핵심 아이디어는 실제로 메모리에서 요소를 지우는 것이 아니라, 범위 밖의 요소들만 앞쪽으로 당겨와 덮어쓰는 것입니다. 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만 출력됩니다.

마무리

이번 튜토리얼에서는 두 개의 포인터(읽기 인덱스와 쓰기 인덱스)를 활용해 특정 범위의 배열 요소를 제거하는 방법을 배웠습니다. 추가 질문이 있다면 댓글로 남겨주세요!