[알고리즘/C++] 중복된 요소 제거하는 방법
- 목차
중복된 요소를 제거하는 방법은 두가지가 있다.
1. map을 사용해 key값들만 뽑아주기
2. unique() 사용하기
1. map을 사용해 key값들만 뽑아주기
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
map<int, int> mp;
int main() {
vector<int> v{ 1,1,2,2,3,3 };
for (int i : v) {
if (mp[i]) {
continue;
}
else {
mp[i] = 1;
}
}
vector<int> ret;
for (auto it : mp) {
ret.push_back(it.first);
}
for (int i : ret) cout << i << '\n';
}
2. unique() 사용하기
unique()란?
: vector와 배열에서 범위내에 맨 앞부터 순서대로 서로를 비교해가며 중복되는 요소를 제거해주는 함수
모두 제거가 되었으면 나머지 부분은 그대로 둔다.
O(n)의 시간 복잡도를 가진다.
예시
vector<int> v = {1,1,2,2,3,3,4,4,5,5};
auto it = unique(v.begin(), v.end());
위와 같은 벡터에서 unique함수를 통해 중복된 문자를 제거해주면 벡터가 다음과 같이 된다.
{1,2,3,4,5,3,4,4,5,5}
중복되는 숫자를 전부 하나씩만 쓴 후에 남은 자리는 그대로 가져오기 때문에 3,4,4,5,5가 들어가 있는 것을 볼 수 있다.
이때 unique의 return 값은 중복된 수를 다 정리한 후 그 다음 이터레이터이다. v[4]까지가 중복된 수 였으므로 it에는 v[5]의 주소가 들어간다.
unique()는 바로 앞뒤의 원소들을 비교하기때문에 정렬을 해줘야 올바른 결과가 나온다.
그러므로 sort를 통해 정렬을 해주는 것이 필수이다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> v{ 4,3,3,2,4,1,3,5,1,3,4,2,5 };
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()),v.end());
for (int i : v) cout << i << '\n';
return 0;
}
/*
출력
1
2
3
4
5
*/
위 코드에서 sort를 통해 벡터를 정렬해주고,
erase통해 뒷부분을 날려주었다.
erase는 시작부분부터 끝부분 전 까지 없애주는 메서드인데, unique()가 중복이 제거된 다음의 이터레이터를 반환하므로 제거된 이후부터 끝까지 없어지는 것이다.
그래서 1,2,3,4,5만 뽑아낼 수 있다.
'프로그래밍 > 알고리즘 개념' 카테고리의 다른 글
| [알고리즘/C++] 재귀함수로 조합 구현하기 (1) | 2024.02.27 |
|---|---|
| [알고리즘/C++] 조합 (1) | 2024.02.27 |
| [알고리즘/C++] 재귀함수로 순열 구현하기 (1) | 2024.02.27 |
| [알고리즘/C++] 순열 (0) | 2024.02.26 |
| [알고리즘/C++] split()함수 구현하기 (0) | 2024.02.23 |