배열에서, 특정 원소의 개수를 파악하는 것을 upper_bound 그리고 lower_bound를 활용해서 할 수 있다.


1
2
3
4
5
6
7
8
9
10
sort(x.begin(), x.end());
 
    vector<ll>::iterator low, high;
    for (int i = 0; i < x.size(); i++) {
        if (mp.find(x[i]) == mp.end()) {
            low = lower_bound(x.begin(), x.end(), x[i]);
            high = upper_bound(x.begin(), x.end(), x[i]);
            mp.insert({ x[i], high - low });
        }
    }
cs



당연하게도 두 bound의 특징을 활용해서 특정 원소의 개수를 파악하기 위해서는 정렬이 필수적이다.


 코드의 경우, low에는 처음으로 벡터의 원소가 x[i] 이상이 되는 원소의 iterator가 반환되고,


high에는 벡터의 원소중, 처음으로 x[i] 초과가 되는 원소의 iterator가 저장된다.



이때 high 혹은 low에서 x.begin()을 빼주면 몇번째 위치인지를 파악할 수 있는 것이고,


이 과정을 생략하고 high와 low의 차이를 구하면, 두 iterator의 위치 차이를 구할 수 있기 때문에, x[i]의 개수가 구해지는 것이다.



'Programming Language > C++' 카테고리의 다른 글

STL list insert, erase (C++)  (1) 2019.09.02
string 대소문자 변환  (0) 2019.08.25
priority_queue  (0) 2019.08.14
(C++) abs 함수의 사용  (0) 2019.08.07
(C++) list STL 출력 및 iterator  (0) 2019.08.04

+ Recent posts