저번 정렬 문제랑 비슷하게 풀었다. 입력으로 들어오는 수의 절댓값이 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
이 링크로 들어가면 더 자세히 알 수 있다.
영어... 번역해준다
그렇다 알아두자
'백준' 카테고리의 다른 글
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 |