본문 바로가기

백준

10867 중복 빼고 정렬하기

저번 정렬 문제랑 비슷하게 풀었다. 입력으로 들어오는 수의 절댓값이 1000을 넘지 않으므로 배열을 따로 만들어서 들어오는 수가 몇개인지 셌다.  다음으로 0이 아니면 수가 들어왔다는 뜻이므로 출력한다. 끗~!

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

int main() {
    int n;
    scanf("%d", &n);
    vector <int> a(2001,0);
    
    for(int i = 0; i < n; i++){
        int input;
        scanf("%d", &input);
        a[input+1000]++;
    }
    
    for(int i = 0;i <= 2000; i++){
        if(a[i] != 0)
            printf("%d ", i-1000);
    }
    
    return 0;
}

만약 범위가 2000이 아니라 더 넓은 범위의 수라면 어떻게 중복을 없앨 수 있을까??

vector<int> arr;
sort(arr.begin(), arr.end());
arr.erase(unique(arr.begin(), arr.end()), arr.end());

이렇게 쓰면 중복이 없어진다. 먼저 sort를 써서 중복인 수들을 모운다. 다음으로 unique 함수를 써준다. 이 함수는 양 옆에 같은 값들이 있으면 그 중 처음 하나만 맨 앞으로 보내준다. 이 과정을 다 끝내고 맨 끝값을 반환한다. 여기서 맨 끝값이라는 건 배열의 끝이 아니라 앞으로 보낸 것들의 끝.. 그래서 위치를 반환해주므로 거기서 부터 실제 끝까지를 erase로 없앤다. 

 

https://en.cppreference.com/w/cpp/algorithm/unique

 

std::unique - cppreference.com

(1) template< class ForwardIt > ForwardIt unique( ForwardIt first, ForwardIt last ); (until C++20) template< class ForwardIt > constexpr ForwardIt unique( ForwardIt first, ForwardIt last ); (since C++20) template< class ExecutionPolicy, class ForwardIt > F

en.cppreference.com

 

이 링크로 들어가면 더 자세히 알 수 있다. 

 

영어... 번역해준다

그렇다 알아두자

'백준' 카테고리의 다른 글

11383 뚊  (0) 2019.11.02
1049 기타줄  (0) 2019.11.01
10989 수 정렬하기 3  (0) 2019.11.01
1252 이진수 덧셈  (0) 2019.10.27
2033 반올림  (0) 2019.10.27