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

C 언어로 배열에서 중복 숫자 삭제하기


사용자가 중복된 요소를 포함하는 배열에 숫자를 직접 입력한다고 가정해 보겠습니다. 이번 글에서는 배열에서 반복되는 숫자나 요소를 찾아 삭제하고, 중복 없이 고유한 값만 남은 배열을 만드는 방법을 알아보겠습니다.

예를 들어,

  • 사용자 입력이 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이 각각 한 번씩만 출력되며, 고유한 요소들만 남은 최종 배열을 확인할 수 있습니다.