사용자가 중복된 요소를 포함하는 배열에 숫자를 직접 입력한다고 가정해 보겠습니다. 이번 글에서는 배열에서 반복되는 숫자나 요소를 찾아 삭제하고, 중복 없이 고유한 값만 남은 배열을 만드는 방법을 알아보겠습니다.
예를 들어,
- 사용자 입력이 12, 30, 12, 45, 67, 30일 경우
- 출력 결과는 12, 30, 45, 67입니다(중복 삭제 후).
프로그램
다음은 배열에서 중복 숫자를 삭제하는 C 프로그램입니다.
#include <stdio.h>
#define MAX 100 // 배열의 최대 크기
int main(){
int array[MAX]; // 크기 100의 배열 선언
int size;
int i, j, k; // 루프 변수
/* 배열의 크기 입력 */
printf("enter the size of array : ");
scanf("%d", &size);
/* 배열에 요소 입력 */
printf("Enter elements in an array : ");
for(i=0; i<size; i++){
scanf("%d", &array[i]);
}
/* 배열에서 중복 요소 찾기 */
for(i=0; i<size; i++){
for(j=i+1; j<size; j++){
/* 중복이 발견되면 */
if(array[i] == array[j]){
/* 현재 중복 요소 삭제 */
for(k=j; k<size; k++){
array[k] = array[k + 1];
}
/* 중복 요소 제거 후 배열 크기 감소 */
size--;
/* 요소 이동이 발생한 경우 j를 증가시키지 않음 */
j--;
}
}
}
printf("\nArray elements after deleting duplicates : ");
/* 중복 요소 삭제 후 배열 출력 */
for(i=0; i<size; i++){
printf("%d\t", array[i]);
}
return 0;
}
프로그램 동작 원리
이 프로그램의 핵심 로직은 두 개의 중첩 루프를 활용하는 것입니다.
- 바깥쪽 루프(i): 기준이 되는 요소를 하나씩 선택합니다.
- 안쪽 루프(j): 기준 요소 바로 다음 위치부터 끝까지 검사하며 같은 값을 찾습니다.
- 중복 발견 시: 세 번째 루프(k)를 통해 해당 요소 뒤의 모든 요소를 한 칸씩 앞으로 이동시켜 중복 값을 덮어씁니다.
- size-- 와 j--: 요소가 하나 제거되었으므로 전체 크기를 줄이고, 요소들이 앞으로 이동했기 때문에 j를 증가시키지 않고 그대로 유지합니다.
이 방식의 시간 복잡도는 O(n²)로, 배열의 크기가 클 경우에는 해시 테이블을 사용하거나 정렬 후 인접한 중복을 제거하는 방법(O(n log n))이 더 효율적일 수 있습니다.
출력
실행 결과는 다음과 같습니다.
enter the size of array : 10 Enter elements in an array : 23 12 34 56 23 12 56 78 45 56 Array elements after deleting duplicates : 23 12 34 56 78 45
위 실행 결과에서 입력값 중 중복된 23, 12, 56이 각각 한 번씩만 출력되며, 고유한 요소들만 남은 최종 배열을 확인할 수 있습니다.