반응형
1. 헤더 선언 #include <algorithm>
2. sort( start, end) or sort( start, end, compare)
ex) sort(arr, arr+n) sort(arr, arr+n,cmp)
시작주소와 끝주소 그리고 cmp함수가 필요합니다.
sort( start, end) -> 이형태는 단순 오름차순으로 정렬해줍니다.
sort함수를 퀵정렬법을 사용하기 때문에 O(nlgn) 입니다.
cmp 구현방법입니다.
left<right return true; -> 오름차순
left>right return true; -> 내림차순
사용예제입니다.
bool cmp(info a, info b) {
if (a.korean > b.korean) //1
return true;
else if(a.korean == b.korean){
if (a.english < b.english) return true; //2
else if(a.english == b.english){
if (a.math > b.math) return true; //3
else if(a.math == b.math) {
if (a.name < b.name)return true; //4
}
}
}
return false;
}
문제 링크:https://www.acmicpc.net/problem/10825
저렇게 사용하는 방법은 단순한 규칙입니다. 퀵정렬방법을 아시는 분들이 왜 저렇게 사용하는지 이해하시겠지만, 이해가 안된다면 방식으로 외워서 사용하는 것도 우선은 괜찮습니다..
정답코드입니다.
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
struct info {
string name;
int korean;
int english;
int math;
};
info arr[100001];
int n = 0;
/*
국어 점수가 감소하는 순서로
국어 점수가 같으면 영어 점수가 증가하는 순서로
국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
*/
bool cmp(info a, info b) {
if (a.korean > b.korean) //1
return true;
else if(a.korean == b.korean){
if (a.english < b.english) return true; //2
else if(a.english == b.english){
if (a.math > b.math) return true; //3
else if(a.math == b.math) {
if (a.name < b.name)return true; //4
}
}
}
return false;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++)
cin >> arr[i].name >> arr[i].korean >> arr[i].english >> arr[i].math;
sort(arr, arr + n, cmp);
for (int i = 0; i < n; i++)
cout << arr[i].name <<'\n';
}
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
c++ 우선순위 큐 priority_queue 사용법 (0) | 2020.07.29 |
---|---|
C++ sort함수 invalid comparator 오류 (0) | 2020.05.04 |
C++ memset 사용법 (0) | 2020.05.03 |
C++ upper_bound, lower_bound 사용하기 (0) | 2020.03.21 |
C++ math사용법 총정리 (0) | 2020.03.13 |