문제

단어 정렬 백준 1181

"맞았습니다."코드

#include <bits/stdc++.h>
using namespace std;

int n;
string st;
vector<string> v;

bool cmp(string &a, string & b){
  if(a.size() != b.size()) return a.size() < b.size(); // 길이 짧은것 우선
  else return a < b; // 사전순
}

int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> n;
  for(int i = 0; i < n; i++) {
    cin >> st;
    v.push_back(st);
  }
  sort(v.begin(), v.end(), cmp);
  v.erase(unique(v.begin(), v.end()), v.end());
  for(auto i : v) cout << i << '\n';
  return 0;
}

리뷰

중복을 제거하는 것은 unique와 erase를 썼는데 이번에 풀면서 배웠다.
unique 를 쓰면 중복은 제거되도 벡터의 크기가 줄어들지는 않는다. unique는 중복되는 원소의 포인터를 맨 뒤로 보내기 때문이다.
unique의 리턴 값은 중복 제거 된 원소의 포인터다.
그래서 erase로 중복 제거된 원소의 포인터 부터 맨 마지막 포인터까지 공간을 삭제해준다.
erase를 하면 아예 메모리가 해제되니까 중복된 부분의 크기만큼 반환되는 것이다.

c++ 벡터 중복 제거 unique와 erase 포스팅

728x90

+ Recent posts