๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœจ Algorithm

[๋ฐฑ์ค€/C++] 18870๋ฒˆ : ์ขŒํ‘œ ์••์ถ•

by nitronium102 2021. 9. 12.

๋ฌธ์ œ

์ˆ˜์ง์„  ์œ„์— N๊ฐœ์˜ ์ขŒํ‘œ X1, X2, ..., XN์ด ์žˆ๋‹ค. ์ด ์ขŒํ‘œ์— ์ขŒํ‘œ ์••์ถ•์„ ์ ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

Xi๋ฅผ ์ขŒํ‘œ ์••์ถ•ํ•œ ๊ฒฐ๊ณผ X'i์˜ ๊ฐ’์€ Xi > Xj๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ขŒํ‘œ์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

X1, X2, ..., XN์— ์ขŒํ‘œ ์••์ถ•์„ ์ ์šฉํ•œ ๊ฒฐ๊ณผ X'1, X'2, ..., X'N๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์ž.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„์—๋Š” ๊ณต๋ฐฑ ํ•œ ์นธ์œผ๋กœ ๊ตฌ๋ถ„๋œ X1, X2, ..., XN์ด ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— X'1, X'2, ..., X'N์„ ๊ณต๋ฐฑ ํ•œ ์นธ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์ถœ๋ ฅํ•œ๋‹ค.

์ œํ•œ

  • 1 ≤ N ≤ 1,000,000
  • -109 ≤ Xi ≤ 109

ํ’€์ด

์ผ๋‹จ ์ขŒํ‘œ ์••์ถ•์ด ๋ญ”์ง€๋ถ€ํ„ฐ ์•Œ์•„์•ผ ํ•œ๋‹ค.

๐Ÿ” ์ขŒํ‘œ ์••์ถ•

์ž…๋ ฅ๋ฐ›์€ ์ขŒํ‘œ๊ฐ’์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ–ˆ์„ ๋•Œ์˜ ์ˆœ์„œ ํ‘œ์‹œ(์ค‘๋ณต์€ ์ œ์™ธ)

์ฆ‰, ํ•ด๋‹น ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์˜ ๊ฐœ์ˆ˜์ด๋‹ค!

 

์ด ๋ฌธ์ œ๋Š” ์‹œ๊ฐ„์ด ๊ต‰์žฅํžˆ ๋นก๋นกํ•ด์„œ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹œ๋„ํ•ด๋ดค๋‹ค.

01. ์ •์„(algorithm - unique / lower_bound ์‚ฌ์šฉ)

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(false);

    int n;
    cin >> n;
    vector<int> v(n); // ์›๋ณธ
    
    // ์ž…๋ ฅ
    while(n--){
        cin >> v[i];
    }
    
    vector<int> v2(v); // ์ •๋ ฌ ๋ฐ ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ์‹œํ–‰ํ•  ๋ฒกํ„ฐ(์›๋ณธ ๋ณต์‚ฌ)
    sort(v2.begin(), v2.end()); //์˜ค๋ฆ„์ฐจ์ˆœ 
    v2.erase(unique(v2.begin(), v2.end()), v2.end());  // ์ค‘๋ณต ์ œ๊ฑฐ
    
    for (int i = 0; i < v.size(); i++){
        // i๋ฒˆ์งธ ์š”์†Œ๊ฐ’์˜ ์œ„์น˜ it
        auto it = lower_bound(v2.begin(), v2.end(), v[i]);
        cout << it - v2.begin() << ' ';
    }
}

lower bound ํ•จ์ˆ˜ ์„ค๋ช…์€ ์—ฌ๊ธฐ ์ฐธ๊ณ 

https://chanhuiseok.github.io/posts/algo-55/

 

์•Œ๊ณ ๋ฆฌ์ฆ˜ - c++ lower_bound, upper_bound ํ™œ์šฉํ•˜๊ธฐ

์ปดํ“จํ„ฐ/IT/์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ฆฌ ๋ธ”๋กœ๊ทธ

chanhuiseok.github.io

 

02. map์„ ํ™œ์šฉํ•œ ํ’€์ด 1(์„ฑ๊ณต์€ ํ–ˆ์œผ๋‚˜ ์•„์Šฌ์•„์Šฌํ•œ ํ’€์ด)

int main(){
    int n, x;
    cin >> n;
    map<int, int> rank; // key : ์ˆซ์ž, value : ์ขŒํ‘œ ์••์ถ•๊ฐ’
    vector<int> num, tmp;

    while(n--){
        cin >> x;
        num.push_back(x);
    }

    tmp = num;
    sort(tmp.begin(), tmp.end());
    int idx = 1;
    for (int i=0; i<tmp.size(); i++) {
        if (!rank[tmp[i]])
            rank[tmp[i]] = idx++;
    }

    for (int i=0; i<num.size(); i++){
        cout << rank[num[i]] - 1 << " ";;
    }
}

 

03. map์„ ํ™œ์šฉํ•œ ํ’€์ด 2(์‹œ๊ฐ„ ์ดˆ๊ณผ)

int main(){
    ios::sync_with_stdio(false);
    cin.tie(false);

    int n, x;
    cin >> n;
    map<int, int> rank; // key : ์ˆซ์ž, value : ์ขŒํ‘œ ์••์ถ•๊ฐ’
    vector<int> num;

    while(n--){
        cin >> x;
        rank[x]; // map์— key ๋„ฃ์–ด์คŒ(์ž๋™ ์ •๋ ฌ)
        num.push_back(x);
    }

    int i=0; // ์ขŒํ‘œ ์••์ถ•๊ฐ’
    for (auto & iter : rank) { // & ๋ถ™์—ฌ์ค˜์•ผ ํ•จ
        iter.second = i++; // ์••์ถ•๊ฐ’ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€
    }

    for (int i=0; i<num.size(); i++){
        cout << rank[num[i]] << " ";;
    }
}

 

๋Œ“๊ธ€