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

C 언어로 배열에서 중복 요소 제거하기: 단계별 가이드

개요

배열 안에 같은 값이 여러 번 들어 있을 때, 이를 모두 제거하고 고유한(unique) 요소만 남긴 배열을 만드는 방법을 알아보겠습니다. 이 글에서는 C 언어를 사용해 중복 요소를 삭제하는 핵심 로직과 전체 소스 코드, 실제 실행 결과까지 차근차근 살펴봅니다.

중복 요소 삭제 로직

배열에서 중복 요소를 삭제하는 핵심 로직은 다음과 같습니다.

1. 바깥쪽 반복문(i)으로 기준이 되는 요소를 하나 선택합니다.
2. 안쪽 반복문(j)으로 그 뒤에 있는 요소들을 차례대로 비교합니다.
3. 두 값이 같으면(a[i] == a[j]) 세 번째 반복문(k)을 사용해 j 위치 이후의 요소들을 한 칸씩 앞으로 당겨 덮어씁니다.
4. 요소가 하나 줄었으므로 배열의 유효 크기(number)를 1 감소시키고, j를 하나 되돌려 같은 위치를 다시 검사하도록 합니다.

for(i=0;i<number;i++){
    for(j = i+1; j < number; j++){
        if(a[i] == a[j]){
            for(k = j; k <number; k++){
                a[k] = a[k+1];
            }
            j--;
            number--;
        }
    }
}

결과 출력 로직

중복이 제거된 배열을 화면에 출력하는 코드는 매우 간단합니다. 유효 크기(number)만큼만 반복하며 요소를 하나씩 출력하면 됩니다.

for(i=0;i<number;i++){
    printf("%d ",a[i]);
}

전체 프로그램

다음은 지금까지 설명한 로직을 모두 포함한, C 언어로 작성된 배열 중복 요소 삭제 프로그램의 전체 소스 코드입니다.

#include<stdio.h>
#include<stdlib.h>
int main(){
    int a[50],i,j,k, count = 0, dup[50], number;
    printf("Enter size of the array\n");
    scanf("%d",&number);
    printf("Enter Elements of the array:\n");
    for(i=0;i<number;i++){
        scanf("%d",&a[i]);
        dup[i] = -1;
    }
    printf("Entered element are: \n");
    for(i=0;i<number;i++){
        printf("%d ",a[i]);
    }
    for(i=0;i<number;i++){
        for(j = i+1; j < number; j++){
            if(a[i] == a[j]){
                for(k = j; k <number; k++){
                    a[k] = a[k+1];
                }
                j--;
                number--;
            }
        }
    }
    printf("\nAfter deleting the duplicate element the Array is:\n");
    for(i=0;i<number;i++){
        printf("%d ",a[i]);
    }
}

코드 흐름 요약

① 사용자로부터 배열의 크기와 요소들을 입력받습니다. → ② 입력된 배열을 그대로 한 번 출력해 확인합니다. → ③ 삼중 반복문 구조로 중복 값을 찾아 제거하고 배열을 앞쪽으로 압축합니다. → ④ 최종적으로 중복이 없는 배열을 출력합니다.

실행 결과

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

Enter size of the array
10
Enter Elements of the array:
1 1 2 4 3 5 6 5 7 1
Entered element are:
1 1 2 4 3 5 6 5 7 1
After deleting the duplicate element, the Array is:
1 2 4 3 5 6 7

입력된 배열 1 1 2 4 3 5 6 5 7 1에서 중복된 값(1, 5)이 모두 제거되어 최종적으로 1 2 4 3 5 6 7이라는 고유한 요소만 남은 배열이 출력되는 것을 확인할 수 있습니다.

참고: 시간 복잡도

이 방식은 모든 요소 쌍을 서로 비교하므로 시간 복잡도는 O(n²)입니다. 배열의 크기가 작거나 중간 정도일 때는 충분히 효율적이지만, 데이터가 매우 큰 경우에는 정렬 후 인접 요소만 비교하는 방법(O(n log n))이나 해시 테이블을 활용하는 방법(O(n))을 고려하는 것이 좋습니다.