a.erase(unique(a.begin(),a.end()),a.end());
vector에 중복 요소가 있을때 제거하는 방법에 대해서 내가 접한 코드에서 이런식으로 처리를 하는 방법을 보게 되었다.
이에 관련하여서 나는 if문을 활용해서 a[i-1]!=a[i] 일때를 출력하면서 중복문을 제거했는데, 이렇게 작성하는 방법은 어떻게 하는건지에 대해서 궁금해서 검색해보았다.
이와 관련해서 unique함수에 대해서 이해가 부족해서 더 검색해서 공부하던중 이해가 잘 되는 블로그와 cplusplus 의 unique 함수 내용을 첨부해본다.
https://cplusplus.com/reference/algorithm/unique/
https://cplusplus.com/reference/algorithm/unique/
function template <algorithm> std::unique equality (1)template ForwardIterator unique (ForwardIterator first, ForwardIterator last);predicate (2)template ForwardIterator unique (ForwardIterator first, ForwardIterator last, BinaryPredicate pred); Remove con
cplusplus.com
https://velog.io/@whipbaek/c-unique-%ED%95%A8%EC%88%98%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC
c++ unique() 함수에 관하여
공부하게 된 배경https://programmers.co.kr/learn/courses/30/lessons/12906위 문제를 푸는데 unique와 erase의 조합 한 줄 만으로 해결하는 코드가 있었다. 문제를 풀 때는 생각이 안났으나 두 함수 모두 대강 알
velog.io
결국 unique함수는 값을 덮어쓰는 방식을 통해서 중복된 부분이 나올때마다 그 부분을 덮어써서 줄여주고 중복이 없는 상태와 그 뒷부분에 불필요한 값들이 모여진 형태의 배열로 만들어준뒤 그때에 중복이 제외된 부분 다음의 첫번째 iterator를 반환하고, , 이제 이걸 erase함수를 이용해서 그 반환된 iterator를 통해서 그 부분부터 마지막 부분까지를 제거해버림으로써 중복을 제거한 형태의 컨테이너와 내용물을
erase()와 unique() 를 통해서 만들어낼 수있는 것이다.
이때에 erase()함수에 대해서 검색한 내용을 첨부해본다.
내가 접한 코드에서 a.erase(unique(a.begin(),a.end()),a.end());
을 시행해서 중복된 요소를 제거한뒤에, 그리고 이어서
for(string& s: a) cout<<s<<'\n';
을 이용해서 vector a 내의 모든 원소들을 출력하는것으로 보아, 확실하게 erase를 통해서 제거되고 컨테이너의 사이즈 조정까지 되는 것으로 보여진다.
중복된 요소의 제거를 위해선, 결국 이 문제를 통해 접하게 된 것을 정리해보면,
sort();
erase(unique(begin(),end()),end());
의 순서를 통하면 중복된 것들을 모두 제거하고 단일 원소들만 남기고 컨테이너를 조정할 수 있다.
물론 내가 처음에 작성한 for문 내부에 if문을 통해서 중복요소를 놔두고 출력하는것도 나쁘지는 않은 풀이지만
이렇게 원하는 원소들만 남기고 컨테이너를 조절할 수 있다는것도 알아두자.
// Authored by : tongnamuu
// Co-authored by : -
// http://boj.kr/e365634189b1497a95abaf856df7758f
#include <bits/stdc++.h>
using namespace std;
int main(void){
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
vector<string>a(n);
for(int i=0;i<n;++i) cin>>a[i];
sort(a.begin(), a.end(), [](const string& u, const string& v){
int ul = u.length();
int vl = v.length();
if(ul!=vl) return ul < vl;
return u < v;
});
a.erase(unique(a.begin(), a.end()), a.end()); // a에서 중복된 원소를 제거하는 명령
for(string& s : a) cout<<s<<'\n';
return 0;
}
'알고리즘 > BOJ' 카테고리의 다른 글
boj 11656번 문제를 통해 접하게된, st.length() 값을 곧바로 사용하는 것이 굉장히 잘못된 방법이 될 수 있는 경우에 대해서. (0) | 2023.05.21 |
---|---|
boj 10814번. stable_sort()를 활용하지 않고 sort()를 사용해서 먼저 입력된 순서를 보존하는 방법. (0) | 2023.05.21 |
boj 1181번 문제를 통해 보는 sort의 compare 함수의 람다표현식으로의 사용. (0) | 2023.05.20 |
boj 5648 역원소 정렬을 통해 배우게된 reverse의 활용과 stoll함수에 관하여 (0) | 2023.05.20 |
bitshift를 이용해서 큰 값을 표현할때의 주의점. 1<<62 (0) | 2023.05.20 |