문제
"맞았습니다."코드
#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를 하면 아예 메모리가 해제되니까 중복된 부분의 크기만큼 반환되는 것이다.
728x90
'알고리즘 > 백준' 카테고리의 다른 글
먹을것인가 먹힐것인가 백준 7795 c++ (0) | 2021.12.20 |
---|---|
빈도 정렬 백준 2910 c++ (0) | 2021.12.19 |
수 정렬하기 5 백준 15688 c++ (0) | 2021.12.18 |
수 정렬하기 3 백준 10989 c++ (메모리 제한 8MB) (0) | 2021.12.17 |
소문난 칠공주 백준 1941번 c++ (0) | 2021.12.12 |