문제 정의
사용자가 프로그램 실행 중(런타임)에 배열에서 삭제할 요소의 위치를 직접 입력하고, 삭제가 완료된 배열의 내용을 화면에 출력하는 C 프로그램을 작성해 보겠습니다. 이때 입력한 위치가 배열의 유효 범위를 벗어나면 "잘못된 입력(Invalid Input)"이라는 메시지를 표시해야 합니다.
해결 방법
배열(Array)은 성격이 같은 여러 데이터를 하나의 이름 아래에 묶어 관리할 수 있는 가장 기본적인 자료구조입니다. 배열에서 수행할 수 있는 대표적인 연산은 다음과 같습니다.
- 삽입(Insert) – 배열에 새로운 요소를 추가합니다.
- 삭제(Delete) – 배열에서 기존 요소를 제거합니다.
- 검색(Search) – 배열에서 원하는 요소를 찾아냅니다.
이번 글에서는 이 중 삭제 연산을 포인터를 활용해 구현하는 방법을 단계별로 살펴보겠습니다.
알고리즘
포인터를 이용해 배열의 요소를 삭제하는 전체 절차는 다음과 같습니다.
- 배열의 크기(n)를 입력받습니다.
- 포인터 변수를 선언합니다.
- malloc() 함수를 사용해 런타임에 필요한 만큼의 메모리를 동적으로 할당합니다.
- 배열의 요소들을 차례대로 입력받습니다.
- 삭제할 요소의 위치(pos)를 입력받습니다.
- 위치가 유효하면(1 ≤ pos ≤ n), 해당 위치부터 마지막 요소까지 한 칸씩 왼쪽으로 이동시켜 요소를 삭제합니다.
- 위치가 유효하지 않으면 "잘못된 입력" 메시지를 출력합니다.
예시 동작
배열의 크기가 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보다 큰 경우 "잘못된 입력"으로 처리하여 프로그램의 안정성을 높였습니다.