C++/c++

[STL] map์—์„œ Value๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ

Rainbow๐ŸŒˆCoder 2022. 1. 15. 22:38
728x90

์ฐธ๊ณ ๋งํฌ: C++ STL์˜ ๊ฐ’๋ณ„๋กœ ๋งต ์ •๋ ฌ - GeeksforGeeks

ํ•ด๋‹น ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.

๊ฒฐ๋ก ์€ map STL ๋‹จ๋…์œผ๋กœ๋Š” Value ๊ธฐ์ค€์œผ๋กœ sortํ•  ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ, Pair <T,T>๋ฅผ ๋‹ด๋Š” vector์„ ์„ ์–ธํ•˜์—ฌ map iteratior์— ๋”ฐ๋ผ ์‚ฝ์ž…ํ•ด์ฃผ๊ณ 

vector์˜ Pair second๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ sortํ•ด์•ผํ•œ๋‹ค.

 

Sorting a Map by value in C++ STL - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

 

์›๋ฆฌ๊ฐ€ ํฅ๋ฏธ๋กœ์›Œ์„œ ์ •๋ฆฌํ•ด๋‘๋ ค๊ณ  ํ•œ๋‹ค.

 

์›๋ฆฌ(์œ„ํ‚ค๋ฐฑ๊ณผ ์ฐธ๊ณ ): 

C++์˜ map์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ธ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋Š” ๋…ธ๋“œ ๊ธฐ๋ฐ˜์˜ ๊ท ํ˜•์ด์ง„ tree๊ตฌ์กฐ(๋ ˆ๋“œ-๋ธ”๋ž™ ์ด์ง„ํŠธ๋ฆฌ)๋กœ ๋งŒ๋“ค์–ด์งˆ ๋•Œ๋ถ€ํ„ฐ set๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‚ฝ์ž…๋  ๋•Œ๋ถ€ํ„ฐ Key์— ๋”ฐ๋ผ ์ž๋™ ์ •๋ ฌ๋œ๋‹ค.

 

๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ๋Š” ๊ฐ๊ฐ์˜ ๋…ธ๋“œ๊ฐ€ ๋ ˆ๋“œ ๋‚˜ ๋ธ”๋ž™ ์ธ ์ƒ‰์ƒ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์ด๋‹ค. ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ์กฐ๊ฑด์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€์ ์ธ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ์œ ํšจํ•œ(valid) ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ๊ฐ€ ๋œ๋‹ค:

 

๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ(red-black tree)๋Š” ์ž๊ฐ€ ๊ท ํ˜• ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ(self-balancing binary search tree)๋กœ์„œ, ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ์—ฐ๊ด€ ๋ฐฐ์—ด ๋“ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์“ฐ์ด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค. 1978๋…„ ๋ ˆ์˜ค ๊ท€๋ฐ”์Šค(Leo J. Guibas)์™€ ๋กœ๋ฒ„ํŠธ

ko.wikipedia.org

  1. ๋…ธ๋“œ๋Š” ๋ ˆ๋“œ ํ˜น์€ ๋ธ”๋ž™ ์ค‘์˜ ํ•˜๋‚˜์ด๋‹ค.
  2. ๋ฃจํŠธ ๋…ธ๋“œ๋Š” ๋ธ”๋ž™์ด๋‹ค.
  3. ๋ชจ๋“  ๋ฆฌํ”„ ๋…ธ๋“œ๋“ค(NIL)์€ ๋ธ”๋ž™์ด๋‹ค.
  4. ๋ ˆ๋“œ ๋…ธ๋“œ์˜ ์ž์‹๋…ธ๋“œ ์–‘์ชฝ์€ ์–ธ์ œ๋‚˜ ๋ชจ๋‘ ๋ธ”๋ž™์ด๋‹ค. (์ฆ‰, ๋ ˆ๋“œ ๋…ธ๋“œ๋Š” ์—ฐ๋‹ฌ์•„ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋ธ”๋ž™ ๋…ธ๋“œ๋งŒ์ด ๋ ˆ๋“œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค)
  5. ์–ด๋–ค ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜์–ด ๊ทธ์— ์†ํ•œ ํ•˜์œ„ ๋ฆฌํ”„ ๋…ธ๋“œ์— ๋„๋‹ฌํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์—๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•˜๋ฉด ๋ชจ๋‘ ๊ฐ™์€ ๊ฐœ์ˆ˜์˜ ๋ธ”๋ž™ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค.

์œ„ ์กฐ๊ฑด๋“ค์„ ๋งŒ์กฑํ•˜๊ฒŒ ๋˜๋ฉด, ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํŠน์„ฑ์„ ๋‚˜ํƒ€๋‚ด๊ฒŒ ๋œ๋‹ค: ๋ฃจํŠธ ๋…ธ๋“œ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋จผ ์žŽ๋…ธ๋“œ ๊ฒฝ๋กœ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๊ฐ€, ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์žŽ๋…ธ๋“œ ๊ฒฝ๋กœ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ์˜ ๋‘ ๋ฐฐ ๋ณด๋‹ค ํ•ญ์ƒ ์ž‘๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ๋Š” ๊ฐœ๋žต์ (roughly)์œผ๋กœ ๊ท ํ˜•์ด ์žกํ˜€ ์žˆ๋‹ค(balanced). ๋”ฐ๋ผ์„œ, ์‚ฝ์ž…, ์‚ญ์ œ, ๊ฒ€์ƒ‰์‹œ ์ตœ์•…์˜ ๊ฒฝ์šฐ(worst-case)์—์„œ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ํŠธ๋ฆฌ์˜ ๋†’์ด(๋˜๋Š” ๊นŠ์ด)์— ๋”ฐ๋ผ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณดํ†ต์˜ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์— ๋น„ํ•ด ํšจ์œจ์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•ด๋‹น ๋ธ”๋กœ๊ทธ๊ฐ€ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…์„ ํ•ด๋†“์•˜๋‹ค. -> ์•Œ๊ณ ๋ฆฌ์ฆ˜ ) Red-Black Tree (tistory.com)


 

๋ฐฉ๋ฒ• 1 – ์Œ์˜ ๋ฒกํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„์ด๋””์–ด๋Š” ๋งต์—์„œ ํ•ด๋‹น ์Œ ๋ฒกํ„ฐ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•˜๊ณ  ์•„๋ž˜์— ์ฃผ์–ด์ง„ lambda ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๋ฒˆ์งธ ๊ฐ’์— ๋”ฐ๋ผ ์Œ์˜ ๋ฒกํ„ฐ๋ฅผ ์ •๋ ฌ

bool cmp(pair<T1, T2>& a,
         pair<T1, T2>& b)
{
    return a.second < b.second;
}

where T1 and T2
are the data-types 
that can be the 
same or different.

๋‹ค์Œ์€ ์œ„์˜ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๊ตฌํ˜„

// C++ program for the above approach
  
#include <bits/stdc++.h>
using namespace std;
  
// Comparator function to sort pairs
// according to second value
bool cmp(pair<string, int>& a,
         pair<string, int>& b)
{
    return a.second < b.second;
}
  
// Function to sort the map according
// to value in a (key-value) pairs
void sort(map<string, int>& M)
{
  
    // Declare vector of pairs
    vector<pair<string, int> > A;
  
    // Copy key-value pair from Map
    // to vector of pairs
    for (auto& it : M) {
        A.push_back(it);
    }
  
    // Sort using comparator function
    sort(A.begin(), A.end(), cmp);
  
    // Print the sorted value
    for (auto& it : A) {
  
        cout << it.first << ' '
             << it.second << endl;
    }
}
  
// Driver Code
int main()
{
  
    // Declare Map
    map<string, int> M;
  
    // Given Map
    M = { { "GfG", 3 },
          { "To", 2 },
          { "Welcome", 1 } };
  
    // Function Call
    sort(M);
    return 0;
}
 
์ถœ๋ ฅ:
Welcome 1
To 2
GfG 3

 

๊ธฐํƒ€ ์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ : 

 

728x90