우선 <algorithm>헤더가 필요하다.
sort와 unique를 함께 써주어야
의도 한 바대로 unique로 vector에서 중복되는 원소를 제거할 수 있다.
두 가지 로직이 가능하다.
첫번째
sort(result.begin(),result.end());
result.resize(unique(result.begin(),result.end())-result.begin());
두번째
sort(result.begin(),result.end());
result.erase(unique(result.begin(), result.end()),result.end());
두 구문을 보면
unique는 중복되는 원소들이 제외된 상태의 vector의 마지막 원소 다음 iterator값을 리턴한다는 것을 눈치챌 수 있다.
즉, unique는 중복 제거를 하고, 마지막 원소의 iterator값을 리턴한다.
Unique를 쓰기 전에 sort를 해주어야만 하는 원리(강조)는 다음과 같다.
unique는 포인터들로 작동한다. first와 result
template<class ForwardIt>
ForwardIt unique(ForwardIt first, ForwardIt last)
{
if (first == last)
return last;
ForwardIt result = first;
while (++first != last) {
if (!(*result == *first) && ++result != first) {
*result = std::move(*first);
}
}
return ++result;
}
std::move는 해당 블로그 참고
씹어먹는 C++ 토막글 ① - Rvalue(우측값) 레퍼런스에 관해 (modoocode.com)
first는 벡터의 맨 첫 번째 원소를 가리키는 포인터로,
비교가 진행될수록 한칸 씩 이동하며 last에 다다르면 첫번째 조건문에 걸려서 return한다.
unique는 result가 가리키고 있는 값과 first가 가리키고 있는 값이 다르다면
result를 한 칸 옮기고 거기에 first가 가리키는 포인터를 std::move시킨다.
즉 result은 원 포인터로서 작동하므로
122345 일 경우
첫번째 2를 result가 가르킬 때 *result = std::move(*first);를 무시하고 while이 진행되고
그 다음 두번째 2에서 3에 먼저 도착한 fisrt포인터를 std::move받는다.
그러나,
212345의 경우에는
2가 중복됨에도 불구하고 계속 *result = std::move(*first);코드가 동작되어
이전에 2을 가리키고 다음에 1를 가리킨 다음 다시 2을 가리킨다한들 2가 중복 원소인지 알지 못하는 것이다.
그래서 Unique를 쓰기 전에
sort를 해주어 값은 값을 가지는 벡터가 원소가 순서대로 이어지게끔 상태를 만들어놓아야 하는 것이다.
작성한 소스코드 1
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> numbers) {
vector<int> result;
for(int i=0; i<numbers.size(); i++)
{
for(int j=0; j<numbers.size(); j++)
{
if(i==j)continue;
int t = numbers[i];
t +=numbers[j];
result.push_back(t);
}
}
sort(result.begin(),result.end());
result.resize(unique(result.begin(),result.end())-result.begin());
return result;
}
작성한 소스코드 2
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> numbers) {
vector<int> result;
for(int i=0; i<numbers.size(); i++)
{
for(int j=0; j<numbers.size(); j++)
{
if(i==j)continue;
int t = numbers[i];
t +=numbers[j];
result.push_back(t);
}
}
sort(result.begin(),result.end());
result.erase(unique(result.begin(), result.end()),result.end());
return result;
}
참고 블로그:
'C++ > c++' 카테고리의 다른 글
[STL] 우선순위 큐 priority_queue (0) | 2022.01.18 |
---|---|
[STL] set (0) | 2022.01.18 |
[STL] map에서 Value를 기준으로 정렬하고 싶을 경우 (0) | 2022.01.15 |
[STL] map (0) | 2022.01.15 |
[STL] Vector내 최대값, 최소값과 그 인덱스 알아내기 (0) | 2022.01.11 |