[C++] unique를 이용한 벡터의 중복원소 제거
[C++] unique를 이용한 벡터의 중복원소 제거unique 함수란? vector 배열에서 중복되지 않는 원소들을 앞에서부터 채워나가는 함수이다. algorithm 헤더에 존재한다. 중복되지 않는 원소들을 앞에서부터 채워나가는 역할을 하기때문에 남은 뒷부분은 그대로 vector 원소값이 존재한다.#include <iostream>#include <vector>#include <algorithm>using namespace std;int main() { vector <int> v; v.push_back(1); v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(3); v.push_back(4); v.push_back(5); v.push_back(5); v.push_back(5); v.push_back(6); cout << "***** 기존 벡터배열 원소 *****" << endl; for (const auto& n : v) cout << n << ' '; cout << endl; cout << "***** unique 함수 적용 *****" << endl; unique(v.begin(), v.end()); for (const auto& n : v) cout << n << ' '; cout << endl; return 0;} unique 함수를 적용하면 위와 같이 중복된 원소를 제거하며 앞에서부터 원소들을 채워나간다. 그렇게 되면 원래 배열보다 원소의 개수가 4개 줄어들고 원래 벡터 배열의 나머지 자리엔 기존 벡터배열 원소의 값이 채워지게된다. 그러면 줄어든 개수를 알면 원래 개수에서 줄어든 범위를 뺀 개수만큼만 확인하면 중복된 원소를 제거한 배열을 출력할 수 있을 것이다. 하지만 문제를 풀거나 보통의 상황에선 몇 개가 중복되고 몇 개의 원소가 줄어든지를 알 수 없기때문에 erase 함수를 사용하여 뒷 부분에 필요없는 값들을 삭제시켜 줄것이다.erase 함수를 이용하여 필요한 값만 남기기 erase 함수는 vector 배열에서 특정 원소를 삭제하는 함수이다. v.erase(v.begin()+s, v.begin()+e) 명령어를 입력하면 [s,e) 원소가 삭제된다. 즉 시작 지점은 닫힌구간, 끝나는 지점은 열린 구간으로 삭제된다. 이를 적용하여 우리는 unique 함수를 적용한 벡터배열에서 필요한 원소만 뽑아낼 수 있다.#include <iostream>#include <vector>#include <algorithm>using namespace std;int main() { vector <int> v; v.push_back(1); v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(3); v.push_back(4); v.push_back(5); v.push_back(5); v.push_back(5); v.push_back(6); cout << "***** 기존 벡터배열 원소 *****" << endl; for (const auto& n : v) cout << n << ' '; cout << endl; cout << "***** erase와 unique 같이 사용하기 *****" << endl; v.erase(unique(v.begin(), v.end()), v.end()); for (const auto& n : v) cout << n << ' '; cout << endl; return 0;} 사진처럼 중복된 원소를 제거하고 원하는 원소들만 출력할 수 있게된다! n개의 원소에 대한 unique 함수의 시간복잡도는 O(n)이다.