[C++] 배열의 중복 요소 찾기

배열의 요소들 중에 중복 요소를 찾는 방법을 소개합니다.

1. set를 이용하여 중복 찾기

set는 기본적으로 중복 요소를 허용하지 않는 자료구조입니다.

아래와 같이 set와 for문을 이용하여 중복 요소를 찾을 수 있습니다. unordered_set.find()는 인자로 전달된 값이 set에 있을 때 그 값을 iterator로 리턴하며, set에 존재하지 않는다면 unordered_set.end()를 리턴합니다.

#include <iostream>
#include <unordered_set>

int main() {
    int arr[] = {1, 2, 5, 3, 2, 5, 9, 7};
    int n = sizeof(arr) / sizeof(*arr);

    std::unordered_set<int> seen;
    std::unordered_set<int> duplicates;
    for (int i = 0; i < n; i++) {
        if (seen.find(arr[i]) != seen.end()) {
            // found
            duplicates.insert(arr[i]);
        }
        seen.insert(arr[i]);
    }

    for (const int &i: duplicates) {
        std::cout << i << ' ';
    }

    return 0;
}

Output:

5 2

2. std::count()를 이용하여 중복 찾기

std::count(first, last, val)는 인자로 전달된 배열의 first와 last의 범위의 요소들 중에 val과 같은 값이 몇개가 있는지 개수를 리턴합니다.

아래와 같이 배열에 같은 값의 요소가 2개 이상 있다면 중복 요소가 있다고 볼 수 있습니다. 이렇게 중복 요소를 찾을 수 있습니다.

#include <iostream>
#include <unordered_set>
#include <algorithm>

int main() {
    int arr[] = {1, 2, 5, 3, 2, 5, 9, 7};
    int n = sizeof(arr) / sizeof(*arr);

    std::unordered_set<int> duplicates;
    for (int i = 0; i < n; i++) {
        int count = std::count(std::begin(arr), std::end(arr), arr[i]);
        if (count > 1) {
            duplicates.insert(arr[i]);
        }
    }

    for (const int &i: duplicates) {
        std::cout << i << ' ';
    }

    return 0;
}

Output:

5 2
Loading script...
codechachaCopyright ©2019 codechacha