문제 정의
사용자가 프로그램 실행 중에 배열에 요소를 삽입하고, 그 결과를 화면에 출력하는 C 프로그램을 작성해야 합니다. 만약 삽입하려는 위치가 배열의 크기보다 크다면 "잘못된 입력(Invalid Input)"이라는 메시지를 표시해야 합니다.
해결 방법
배열(Array)은 성격이 같은 여러 데이터를 하나의 이름 아래 묶어 저장하는 자료구조입니다. 배열에서 수행할 수 있는 기본 연산은 다음과 같습니다.
- 삽입(Insert)
- 삭제(Delete)
- 검색(Search)
이 글에서는 포인터와 동적 메모리 할당(malloc())을 활용해 배열에 새로운 요소를 삽입하는 방법을 다룹니다. 포인터 표기법인 *(a+i)는 a[i]와 동일하게 동작하므로, 인덱스 대신 포인터 산술 연산으로 배열 요소에 접근할 수 있습니다.
알고리즘
포인터를 사용하여 배열에 요소를 삽입하는 절차는 다음과 같습니다.
- 배열의 크기(요소 개수)를 선언하고 입력받습니다.
- 포인터 변수를 선언합니다.
malloc()함수로 실행 시점에 필요한 만큼의 메모리를 동적으로 할당합니다.- 배열 요소들을 입력받습니다.
- 새 요소를 삽입할 위치를 입력받습니다.
- 위치가 배열 크기보다 작거나 같은지 검사하고, 그렇지 않으면 "잘못된 입력"을 출력합니다.
- 해당 위치에 새 요소를 삽입하고, 그 위치 오른쪽의 기존 요소들은 한 칸씩 뒤로 밀어냅니다.
예시
배열의 크기가 5이고, 배열 요소가 다음과 같다고 가정해 보겠습니다.
1 2 3 4 5
여기에 값 9를 4번째 위치에 삽입하면 결과는 다음과 같습니다.
After insertion the array elements are:
1 2 3 9 4 5
C 프로그램 예제
다음은 포인터를 활용해 배열에 요소를 삽입하는 C 프로그램입니다.
#include<stdio.h>
#include<stdlib.h>
// 삽입 함수: n1은 배열 크기, a는 배열 포인터,
// len은 삽입 위치, ele는 삽입할 요소
void insert(int n1, int *a, int len, int ele){
int i;
printf("Array elements after insertion is:\n");
// 삽입 위치 이전까지의 요소 출력
for(i=0;i<len-1;i++){
printf("%d\n",*(a+i));
}
// 새로 삽입한 요소 출력
printf("%d\n",ele);
// 나머지 요소 출력
for(i=len-1;i<n1;i++){
printf("%d\n",*(a+i));
}
}
int main(){
int *a,n1,i,len,ele;
printf("enter size of array elements:");
scanf("%d",&n1);
// 실행 시점에 메모리 동적 할당
a=(int*)malloc(n1*sizeof(int));
printf("enter the elements:\n");
for(i=0;i<n1;i++){
scanf("%d",a+i); // 포인터 산술 연산으로 주소 전달
}
printf("enter the position where the element need to be insert:\n");
scanf("%d",&len);
if(len<=n1){
printf("enter the new element that to be inserted:");
scanf("%d",&ele);
insert(n1,a,len,ele);
} else {
printf("Invalid Input");
}
return 0;
}
실행 결과
위 프로그램을 컴파일하여 실행하면 다음과 같은 결과가 출력됩니다.
enter size of array elements:5
enter the elements:
1
3
5
7
2
enter the position where the element need to be insert:
5
enter the new element that to be inserted:9
Array elements after insertion are:
1
3
5
7
9
2
핵심 정리
이 프로그램의 핵심은 세 가지입니다. 첫째, malloc(n1*sizeof(int))을 통해 실행 시점에 배열 크기만큼 메모리를 유연하게 확보했습니다. 둘째, scanf("%d", a+i)처럼 포인터 산술 연산으로 배열 요소의 주소를 직접 전달했습니다. 셋째, 삽입 위치의 유효성을 검사해 잘못된 입력을 방지했습니다. 참고로 동적으로 할당한 메모리는 프로그램 종료 전에 free(a)로 해제해 주는 것이 안전한 습관입니다.