Loading...
본문 바로가기
👥
총 방문자
📖
0개 이상
총 포스팅
🧑
오늘 방문자 수
📅
0일째
블로그 운영

여러분의 방문을 환영해요! 🎉

다양한 개발 지식을 쉽고 재미있게 알려드리는 블로그가 될게요. 함께 성장해요! 😊

백준 문제풀이

[백준][이분 탐색] 18770 c++ 구현

by 꽁이꽁설꽁돌 2024. 3. 20.
728x90
반응형

목차

    https://www.acmicpc.net/problem/18870

     

    18870번: 좌표 압축

    수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다. X1, X2, ..., XN에

    www.acmicpc.net

    문제

     

    문제 풀이

    나는 중복을 제거해준 정렬된 배열을 따로 만들어 이분 탐색을 하는 식으로 코드를 구현했다.

     

     

     

    코드 구현

    #include <iostream>
    #include <vector>
    #include <set>
    #include <algorithm>
    using namespace std;
    
    vector <pair<int, int>> v;   //벡터 페어로 각각 개수 저장
    vector <int> sort_v;    //정렬된 중복x  배열
    int main()
    {
        int n, i, num, start, end;
    
        cin >> n;
        for (i = 0; i < n; i++) {
            cin >> num;
            v.push_back(make_pair(num, 0));
            sort_v.push_back(num);
        }
        sort(sort_v.begin(), sort_v.end());  //정렬
        sort_v.erase(unique(sort_v.begin(), sort_v.end()), sort_v.end());  //중복 제거 
      
        for (i = 0; i < n; i++) {  //이분탐색 시작
            start = 0;  //시작점
            end = sort_v.size() - 1;  //끝점
            while (start <= end) {
                int mid = (start + end) / 2;  
                if (sort_v[mid] < v[i].first) {
                    start = mid + 1;
                }
                else if (sort_v[mid] > v[i].first) {
                    end = mid - 1;
                }
                else {
                    v[i].second = mid;
                    break;
                }
    
            }
        }
    
        for (i = 0; i < n; i++) {
            cout  << v[i].second<<" ";
        }
    
    }
    반응형