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

C 언어 포인터를 활용해 배열 요소를 삭제하는 프로그램 만들기

문제 정의

사용자가 프로그램 실행 중(런타임)에 배열에서 삭제할 요소의 위치를 직접 입력하고, 삭제가 완료된 배열의 내용을 화면에 출력하는 C 프로그램을 작성해 보겠습니다. 이때 입력한 위치가 배열의 유효 범위를 벗어나면 "잘못된 입력(Invalid Input)"이라는 메시지를 표시해야 합니다.

해결 방법

배열(Array)은 성격이 같은 여러 데이터를 하나의 이름 아래에 묶어 관리할 수 있는 가장 기본적인 자료구조입니다. 배열에서 수행할 수 있는 대표적인 연산은 다음과 같습니다.

  • 삽입(Insert) – 배열에 새로운 요소를 추가합니다.
  • 삭제(Delete) – 배열에서 기존 요소를 제거합니다.
  • 검색(Search) – 배열에서 원하는 요소를 찾아냅니다.

이번 글에서는 이 중 삭제 연산을 포인터를 활용해 구현하는 방법을 단계별로 살펴보겠습니다.

알고리즘

포인터를 이용해 배열의 요소를 삭제하는 전체 절차는 다음과 같습니다.

  1. 배열의 크기(n)를 입력받습니다.
  2. 포인터 변수를 선언합니다.
  3. malloc() 함수를 사용해 런타임에 필요한 만큼의 메모리를 동적으로 할당합니다.
  4. 배열의 요소들을 차례대로 입력받습니다.
  5. 삭제할 요소의 위치(pos)를 입력받습니다.
  6. 위치가 유효하면(1 ≤ pos ≤ n), 해당 위치부터 마지막 요소까지 한 칸씩 왼쪽으로 이동시켜 요소를 삭제합니다.
  7. 위치가 유효하지 않으면 "잘못된 입력" 메시지를 출력합니다.

예시 동작

배열의 크기가 5이고, 배열 요소가 다음과 같이 저장되어 있다고 가정해 보겠습니다.

1 2 3 4 5

여기서 4번째 위치의 요소를 삭제하면, 그 뒤에 있던 요소들이 한 칸씩 앞으로 이동하여 최종 결과는 다음과 같습니다.

삭제 후 배열의 요소:
1 2 3 5

예제 코드

다음은 포인터를 사용하여 배열에서 요소를 삭제하는 전체 C 프로그램입니다.

#include <stdio.h>
#include <stdlib.h>

void deleteElement(int n, int *a, int pos);

int main() {
    int *a, n, i, pos;

    printf("배열의 크기를 입력하세요: ");
    scanf("%d", &n);

    a = (int *)malloc(sizeof(int) * n);
    if (a == NULL) {
        printf("메모리 할당에 실패했습니다.\n");
        return 1;
    }

    printf("배열 요소를 입력하세요:\n");
    for (i = 0; i < n; i++) {
        scanf("%d", (a + i));
    }

    printf("삭제할 요소의 위치를 입력하세요: ");
    scanf("%d", &pos);

    deleteElement(n, a, pos);

    free(a);
    return 0;
}

void deleteElement(int n, int *a, int pos) {
    int i;

    if (pos >= 1 && pos <= n) {
        /* 삭제된 위치 뒤의 요소들을 한 칸씩 앞으로 이동 */
        for (i = pos - 1; i < n - 1; i++) {
            *(a + i) = *(a + i + 1);
        }

        printf("삭제 후 배열의 요소:\n");
        for (i = 0; i < n - 1; i++) {
            printf("%d\n", *(a + i));
        }
    } else {
        printf("잘못된 입력입니다.\n");
    }
}

실행 결과

위 프로그램을 컴파일하여 실행하면 다음과 같은 결과가 화면에 출력됩니다.

배열의 크기를 입력하세요: 5
배열 요소를 입력하세요:
12
34
56
67
78
삭제할 요소의 위치를 입력하세요: 4
삭제 후 배열의 요소:
12
34
56
78

코드 핵심 정리

  • 동적 메모리 할당: malloc(sizeof(int) * n)으로 실행 시간에 배열 크기만큼 메모리를 확보합니다. 사용이 끝난 후에는 free()로 반드시 메모리를 해제하는 것이 좋습니다.
  • 포인터 연산: *(a + i)는 a[i]와 완전히 동일한 표현으로, 포인터 산술 연산만으로도 배열 요소에 접근할 수 있음을 보여줍니다.
  • 삭제의 원리: 배열은 요소를 물리적으로 지우는 것이 아니라, 삭제 위치 뒤의 요소들을 앞으로 한 칸씩 덮어쓰는 방식으로 삭제를 구현합니다. 따라서 삭제 후 실제로 사용되는 배열의 크기는 n - 1이 됩니다.
  • 유효성 검사: 삭제 위치가 1보다 작거나 n보다 큰 경우 "잘못된 입력"으로 처리하여 프로그램의 안정성을 높였습니다.