Records rather than Memories

C++ STL sort()함수 다루기 2 본문

Software/C

C++ STL sort()함수 다루기 2

Downer 2019. 12. 1. 13:00

class를 통해 여러 변수가 존재하는 상황에서 ''특정한 변수'를 기준으로 정렬하는 방법을 적용해봤다.

 

그런데 class를 이용하는 것은 앞서 말한 것처럼 실무에 적용하는 것이고,

만약 프로그래밍 대회 같이 빠르게 적용하고 싶다면 어떻게 해야할까?

 

 

- 일반적으로 빠른 개발이 필요할 때는 페어(pair) 알고리즘이 적용된다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main(void) {
    //vector형에 담긴 페어 int, string 한 쌍의 데이터
    vector<pair<intstring> > v;
    v.push_back(pair<intstring>(7"용 갑옷"));
    v.push_back(pair<intstring>(1"천 갑옷"));
    v.push_back(pair<intstring>(3"강철 갑옷"));
    v.push_back(pair<intstring>(5"수정 갑옷"));
    v.push_back(pair<intstring>(2"가죽 갑옷"));
    //리스트 마지막에 삽입
 
    sort(v.begin(), v.end());
 
    for(int i = 0; i < v.size(); i++) {
        cout << v[i].second << ' ';
        // 이름값을 출력
    }
 
    return 0;
}
cs

 

다음과 같이 벡터(vector) 라이브러리와 페어(pair)라이브러리를 이용해 배열과 클래스를 이용했던 방법을 대체했다. 이렇게 소스코드르이 길이를 짧게 해주는 기법을 숏코딩이라고 한다.

 

* 벡터(Vector) STL은 배열과 같이 작동하는데 원소를 삽입, 삭제를 쉽게 할 수 있기 때문에 배열을 사용하기 쉽게 바꾼 자료구조라고 할 수 있다. Pair STL 또한 한 쌍의 데이터를 처리 할 수 있게 하기 때문에 편리한 자료구조이다.

 

 

그렇다면 만약 변수가 3개 일 때 어떠한 기준으로 정렬할 수 있을까?

 

 

아이템을 나타내는 정보가 등급, 이름, 업그레이드 수치 일때 아이템을 등급 순으로 나열하고자 한다. 그런데 만약 등급이 동일하다면 업그레이드 수치가 높은 아이템을 더 높은 우선순위로 놓는다.

 

위의 예제는 변수가 두개였는데 어떻게 세 개를 작성 할 수 있을까?

- 똑같이 벡터와 페어 STL을 이용하지만 기준이 두 개이므로 2중 페어를 사용한다.

 

<아이템 리스트>

 

7용 갑옷,  0

7 용 갑옷,  3

1천 갑옷,  1

3강철 갑옷,  2

5수정 갑옷, 4

2가죽 갑옷, 0

3 강철 갑옷,  3

 

 

위와 같은 아이템 리스트가 있을 때 먼저 등급에 따라 정렬을 하고, 등급이 같다면 업그레이드 수치가 높은것이 먼저 출력되면 된다. 예를 들어 (7,  용 갑옷,  0)  보다  (7,  용 갑옷,  3)이 먼저 출력되어야 한다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
bool compare(pair<intpair<stringint> > a,
                pair<intpair<stringint> > b) {
                if(a.first == b.first) {
                    return a.second.second > b.second.second;
                    // 등급이 같다면 업그레이드 수치 높은 것이 우선
                } else {
                    return a.first > b.first;
                    //같지 않다면 그냥 등급순
                }
}
int main(void) {
    //vector형에 담긴 페어 int, string 한 쌍의 데이터
    vector<pair<intpair<stringint> > v;
    v.push_back(pair<intpair<stringint> >(7pair<intint >("용 갑옷",  0)));
    v.push_back(pair<intpair<stringint> >(7pair<intint >("용 갑옷",  3)));
    v.push_back(pair<intpair<stringint> >(1pair<intint >("천 갑옷",  1)));
    v.push_back(pair<intpair<stringint> >(3pair<intint >("강철 갑옷",  2)));
    v.push_back(pair<intpair<stringint> >(5pair<intint >("수정 갑옷",  4)));
    v.push_back(pair<intpair<stringint> >(2pair<intint >("가죽 갑옷",  0)));
    v.push_back(pair<intpair<stringint> >(3pair<intint >("강철 갑옷",  3)));
 
    sort(v.begin(), v.end(), compare);
 
    for(int i = 0; i < v.size(); i++) {
        cout << v[i].second << ' ';
        // 이름값을 출력
    }
 
    return 0;
}
cs

 

 

Comments