일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- I'm glad
- if조건절
- for ing
- by any chance
- 명세기반테스트
- 명절 표현
- C++
- know
- by until
- 변수
- ISTQB
- happen to
- sort함수
- 형변환
- relif
- keep -ing
- metascore
- 제5인격
- Realtime Rendering
- gameQA
- end up ing
- UE4
- it's a good thing
- html
- might have p.p
- counldn't have
- java
- 코로나19
- continue to
- 게임QA
- Today
- Total
Records rather than Memories
C++ STL sort()함수 다루기 2 본문
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<int, string> > v;
v.push_back(pair<int, string>(7, "용 갑옷"));
v.push_back(pair<int, string>(1, "천 갑옷"));
v.push_back(pair<int, string>(3, "강철 갑옷"));
v.push_back(pair<int, string>(5, "수정 갑옷"));
v.push_back(pair<int, string>(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<int, pair<string, int> > a,
pair<int, pair<string, int> > 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<int, pair<string, int> > v;
v.push_back(pair<int, pair<string, int> >(7, pair<int, int >("용 갑옷", 0)));
v.push_back(pair<int, pair<string, int> >(7, pair<int, int >("용 갑옷", 3)));
v.push_back(pair<int, pair<string, int> >(1, pair<int, int >("천 갑옷", 1)));
v.push_back(pair<int, pair<string, int> >(3, pair<int, int >("강철 갑옷", 2)));
v.push_back(pair<int, pair<string, int> >(5, pair<int, int >("수정 갑옷", 4)));
v.push_back(pair<int, pair<string, int> >(2, pair<int, int >("가죽 갑옷", 0)));
v.push_back(pair<int, pair<string, int> >(3, pair<int, int >("강철 갑옷", 3)));
sort(v.begin(), v.end(), compare);
for(int i = 0; i < v.size(); i++) {
cout << v[i].second << ' ';
// 이름값을 출력
}
return 0;
}
|
cs |
'Software > C' 카테고리의 다른 글
다이나믹 프로그래밍 : : 타일링 문제 (0) | 2019.12.03 |
---|---|
다이나믹 프로그래밍(Dynamic Programming) (0) | 2019.12.02 |
[C++] STL sort() 함수 다루기 (0) | 2019.11.30 |
합집합 찾기(Union-Find) (0) | 2019.11.28 |
크루스칼 알고리즘(Kruskal Algorithm) (0) | 2019.11.28 |