클래스(Class)를 정의해서 여러 개의 변수가 존재하는 상황에서 '특정한 변수' 를 기준으로 정렬하는 방법은
실무에서는 적합한 방법이지만 프로그래밍 속도 측면에서는 유리하지 않다.
일반적으로 프로그래밍 대회같은 빠른 개발이 필요할 때는 페어(Pair) 라이브러리를 사용하는 것이 효율적이다.
#include <iostream>
#include <algorithm>
#include <string>
#include <vector> // vector가 정의되어 있는 헤더
using namespace std;
int main(void) {
vector<pair<int, string> > v; // pair : 한 쌍의 배열(int, string)을 묶어음
v.push_back(pair<int, string>(90, "잉여인간 1호")); // 배열의 마지막 부분에 삽입을 나타내는 push.back
v.push_back(pair<int, string>(85, "잉여인간 2호"));
v.push_back(pair<int, string>(65, "잉여인간 3호"));
v.push_back(pair<int, string>(84, "잉여인간 4호"));
v.push_back(pair<int, string>(78, "잉여인간 5호"));
sort(v.begin(), v.end()); // 배열의 첫번째 값 부터 마지막 값 까지 정렬
for (int i = 0; i < v.size(); i++) { // v.size() : 백터의 크기
cout << v[i].second << ' '; // second는 선언시 int와 string중 2번째 즉 string 을 가져온다는 뜻
} // first 입력시 int 즉 점수를 가져온다.
return 0;
}
벡터(Vector) 라이브러리와 페어(Pair) 라이브러리를 이용해 Class를 사용하여 정렬했던 방식을 대처하였다.
이처럼 벡터(Vector) 라이브러리와 페어(Pair) 라이브러리 등을 이용하여 코드의 길이를 짧게 해주는 기법을
숏 코딩(Short Coding)이라고 한다.
=> 코드의 시간 복잡도가 동일하다면 프로그래밍 대회에서는 소스코드가 짧을 수록 남들보다 앞서다고 한다.
벡터(Vector) STL은 배열과 같이 작동하고 원소를 선택적 삽입(Puch) 삭제(Pop)을 할 수 있다.
=> 즉 배열을 보다 사용하기 쉽게 개편한 자료구조이다.
페어(Pair) STL은 한 쌍의 데이터를 처리할 수 있게 해주는 자료 구조이다.
2개 이상의 변수를 정렬하는 방법
#include <iostream>
#include <algorithm>
#include <string>
#include <vector> // vector가 정의되어 있는 헤더
using namespace std;
bool compare(pair<string, pair<int, int> > a,
pair<string, pair<int, int> > b) {
if (a.second.first == b.second.first) {
return a.second.second > b.second.second; // 성적이 같다면 생년월일이 느린사람이 우선
}
else {
return a.second.first > b.second.first;
}
}
int main(void) {
vector<pair<string, pair<int, int> > > v; // pair 안에 pair가 들어가는 2중 pair
v.push_back(pair<string, pair<int, int> >("잉여인간 1호", pair<int, int>(95, 19970321))); // 이름 성적 생년월일을 입력
v.push_back(pair<string, pair<int, int> >("잉여인간 2호", pair<int, int>(90, 19970321)));
v.push_back(pair<string, pair<int, int> >("잉여인간 3호", pair<int, int>(89, 19970321)));
v.push_back(pair<string, pair<int, int> >("잉여인간 4호", pair<int, int>(75, 19970321)));
v.push_back(pair<string, pair<int, int> >("잉여인간 5호", pair<int, int>(94, 19970321)));
sort(v.begin(), v.end(), compare);
for (int i = 0; i < v.size(); i++) {
cout << v[i].first << ' '; // 이름 순으로 출력
}
}
정렬을 해주어야 하는 개수가 2개 이상일 경우 추가로 compare를 정의해주어야 한다.
반응형
'알고리즘 > 풀이 힌트' 카테고리의 다른 글
[알고리즘] 계수 정렬 (0) | 2022.02.10 |
---|---|
[알고리즘] 힙 정렬 (4) | 2022.02.10 |
[알고리즘] C++ STL sort() 함수_class (0) | 2022.02.10 |
[알고리즘] 퀵 정렬_구현 (0) | 2022.02.09 |
[알고리즘] 퀵 정렬_원리 (0) | 2022.02.09 |