알고리즘/Algorithm
std::sort 정렬 기준 바꾸기
proqk
2019. 5. 12. 15:40
반응형
문제 풀 때마다 맨날 헷갈려서 정리했음
1. 일반 배열 내림차순 정렬
#include <stdio.h>
#include <algorithm>
using namespace std;
int n, a[10];
bool compare2(const int&x, const int&y) {
return x > y;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
sort(a, a + n, compare2);
for (int i = 0; i < n; i++) {
printf("%d\n", a[i]);
}
}
2. vector 오름차순 정렬
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
int n;
vector<int> a(5);
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
sort(a.begin(), a.end());
for (int i = 0; i < n; i++) {
printf("%d\n", a[i]);
}
}
3. pair 배열
3-1) first를 기준으로 오름차순 정렬
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
int n;
pair<int, int> a[10];
bool compare(pair<int, int> x, pair<int, int> y) {
return x.first < y.first;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &a[i].first, &a[i].second);
}
sort(a, a+n, compare);
for (int i = 0; i < n; i++) {
printf("%d %d\n", a[i].first, a[i].second);
}
}
3-2) second를 기준으로 내림차순 정렬
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
int n;
pair<int, int> a[10];
bool compare(pair<int, int> a, pair<int, int> b){
return a.second>b.second;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &a[i].first, &a[i].second);
}
sort(a, a+n, compare);
for (int i = 0; i < n; i++) {
printf("%d %d\n", a[i].first, a[i].second);
}
}
3-3) second를 기준으로 오름차순 정렬하는데, second가 같으면 first를 기준으로 오름차순 정렬
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<pair<int, int>>v;
bool cmp(pair<int, int>x, pair<int, int>y) {
if (x.second != y.second) return x.second < y.second;
else return x.first < y.first;
}
int main() {
int n;
cin >> n;
while (n--) {
int a, b;
cin >> a >> b;
v.push_back({ a,b });
}
sort(v.begin(), v.end(), cmp);
for(auto x: v) {
cout << x.first << " " << x.second << "\n";
}
}
4. 구조체 정렬
4-1) m을 기준으로 오름차순 정렬
#include <stdio.h>
#include <algorithm>
using namespace std;
int n;
struct j {
int m;
int v;
}a[300005];
bool compare(const j&x, const j&y) {
return x.m < y.m;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &a[i].m, &a[i].v);
}
sort(a, a + n, compare);
}
4-2) v를 기준으로 내림차순 정렬(함수 따로 선언)
#include <stdio.h>
#include <algorithm>
using namespace std;
int n;
struct j {
int m;
int v;
}a[300005];
bool compare(const j&x, const j&y) {
return x.v > y.v;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &a[i].m, &a[i].v);
}
sort(a, a + n, compare);
}
4-3) v를 기준으로 내림차순 정렬(함수 바로 선언)
#include <stdio.h>
#include <algorithm>
using namespace std;
int n;
struct j {
int m;
int v;
}a[300005];
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &a[i].m, &a[i].v);
}
sort(a, a + n, [](j x, j y) { return x.v > y.v; });
for (int i = 0; i < n; i++) {
printf("%d %d\n", a[i].m, a[i].v);
}
}
4-4) v를 기준으로 내림차순 정렬하는데 v가 같으면 m을 기준으로 오름차순
#include <stdio.h>
#include <algorithm>
using namespace std;
int n;
struct j {
int m;
int v;
}a[300005];
bool cmp(j a, j b) { //내림차순
if (a.v != b.v)
return a.v > b.v;
else
return a.m < b.m;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &a[i].m, &a[i].v);
}
sort(a, a + n, cmp);
for (int i = 0; i < n; i++) {
printf("%d %d\n", a[i].m, a[i].v);
}
}
5. 응용
5-1) 1의 자리를 기준으로 오름차순 정렬
#include <stdio.h>
#include <algorithm>
using namespace std;
int n, a[10];
bool compare(const int&x, const int&y) {
return x % 10 < y % 10;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
sort(a, a + n, compare);
for (int i = 0; i < n; i++) {
printf("%d\n", a[i]);
}
}
반응형