boj 1181번 문제를 통해 접하게된 erase(),unique()를 활용한 중복 요소 제거 방법.
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;
}
  Comments,     Trackbacks