※ unique 함수

- 벡터에서 중복원소를 제거할 때, sort, erase, unique 기능을 적절히 활용하여 제거할 수 있기에

 unique 함수의 사용은 익혀야 할 필요성이 두드러진다 생각한다. 

- 또한 int가 아닌 char형도 가능하다는 점에서 대단히 유용하다.

 

cf. 만약, sort하지말고 중복원소를 제거하라면 set + assign함수를 사용한다.

(set은 중복 원소를 허용하지 않는 컨테이너기 때문이다.)

https://scarlettb.tistory.com/70

[백준 13915번: https://www.acmicpc.net/problem/13915]

 

13915번: 현수의 열기구 교실

현수는 열기구 여름특강의 강사다. 현수는 매우 성실해서 모든 수강생들의 열기구 비행을 기록하고있다. 매 비행 이후, 현수는 그 비행에 참석한 수강생들의 기록을 리스트에 추가한다. 리스트

www.acmicpc.net

 

 

§ unique의 원리

- "정렬된" 원소에 대해 vector의 제일 뒷부분으로 쓰레기값으로 보내버린다.

- 따라서 "정렬"되어야 하므로 sort를 사용해야한다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int N;  cin >> N;
    vector<int> v;
    for(int i = 0; i < N; i++){
        int num;    cin >> num;
        v.push_back(num);
    }

    sort(v.begin(), v.end());

    unique(v.begin(), v.end());

    for(auto x:v)
        cout << x << " ";
}

 

input >>  1 4 3 2 2 3 1 5 3 5 4
output << 1 2 3 4 5 3 3 4 5 5

앞에 1 2 3 4 5가 정렬된 이후 뒤 숫자는 아무렇게나 쓰레기값이 들어간 것을 알 수 있다.

 

 

 

 

§  중복원소제거 정렬

따라서 정렬 후 erase와 unique로 삭제할 수 있다.

다음과 같이 작성하면 된다.

sort(v.begin(), v.end());
v.erase( unique(v.begin(), v.end()), v.end() );

 

 

 

 

 

 

 

 

 

 

※ 중복된 원소 제거 => sort, erase(unique())

 

[백준 10867번: https://www.acmicpc.net/problem/10867]

 

10867번: 중복 빼고 정렬하기

첫째 줄에 수의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

[숫자벡터에 대한 중복 원소 제거]

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int N;  cin >> N;
    vector<int> v;
    for(int i = 0; i < N; i++){
        int num;    cin >> num;
        v.push_back(num);
    }

    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());

    for(auto x:v)
        cout << x << " ";
}

 

 

 

[문자벡터에 대한 중복 원소 제거]

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<char> s;
    for (int i = 0; i < 10; i++) {
        char c;     cin >> c;
        s.push_back(c);
    }
    sort(s.begin(), s.end());
    s.erase(unique(s.begin(), s.end()), s.end());

    for(auto x:s)
        cout << x << " ";
}

 

+ Recent posts