[백준/C++]#10814 - 나이순 정렬
2021. 1. 28. 17:25ㆍ필요/코딩테스트(백준)
풀이
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
struct member { // 구조체 정의
int age;
string name;
};
bool cmp(const member &x,const member &y) { // 비교함수
return x.age < y.age;
}
int main() {
int n;
cin >> n;
vector <member> a(n);
for (int i=0; i<n; i++) { // 입력
cin >> a[i].age >> a[i].name;
}
stable_sort(a.begin(), a.end(), cmp);
for (int i=0; i<n; i++) { // 출력
cout << a[i].age << " " << a[i].name << '\n';
}
return 0;
}
개념
이번에는 stable_sort() 함수를 사용했다.
stable_sort()는 다른 요소들의 정렬 순서가 정렬 전과 같이 그대로 유지되는 정렬이다.
비교하는 값이 동일하면, 굳이 자리를 바꾸지 않는 것을 말한다.
풀이
지난번과 같이 두 변수를 짝지어 저장하기 위해, 구조체를 사용한다.
나이와 이름을 저장하므로 int와 string으로 구성된 변수를 정의한다.
이를 입력받은 뒤, stable_sort()로 정렬하면 된다.
cmp 함수는 오른쪽에 해당하는 age가 클 때, true를 반환한다.
이를 sort 3번째 항에 대입하면 age를 오름차순으로 나타낼 수 있다.
+a
const를 사용하지 않으면 컴파일 에러가 발생한다.
다른방법①
연산자 오버로딩을 해보았다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
struct member {
int age;
string name;
int join;
bool operator < (const member &v) const {
return (age < v.age) || (age == v.age && join < v.join);
}
};
int main() {
int n;
cin >> n;
vector <member> a(n);
for (int i=0; i<n; i++) {
cin >> a[i].age >> a[i].name;
a[i].join = i;
}
sort(a.begin(), a.end());
for (int i=0; i<n; i++) {
cout << a[i].age << " " << a[i].name << '\n';
}
return 0;
}
다른방법②
람다식을 사용한 방법을 처음 접해보았다.
많은 코드를 생략해 간단히 인터페이스의 추상 메소드를 생성하는 방법이라고 한다.
사용 조건으로는 메소드가 단 1개여야한다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
struct member {
int age;
string name;
int join;
};
int main() {
int n;
cin >> n;
vector <member> a(n);
for (int i=0; i<n; i++) {
cin >> a[i].age >> a[i].name;
a[i].join = i;
}
sort(a.begin(), a.end(), [](member u, member v) {
return (u.age < v.age) || (u.age == v.age && u.join < v.join);
});
for (int i=0; i<n; i++) {
cout << a[i].age << " " << a[i].name << '\n';
}
return 0;
}
람다식
[ ]에는 사용할 외부 변수를 넣어서 람다 내부에서 이용가능하다.
( )에는 람다가 받을 인자가 들어간다.
원래 그 옆에 '->반환타입' 이 있어서 반환타입을 적어준다.
생략해도 return되는 형태를 통해 컴파일러가 알아서 반환한다.
{ }에는 출력할 statement가 들어간다.
'필요 > 코딩테스트(백준)' 카테고리의 다른 글
[백준/C++]#10989 - 수 정렬하기 3 (0) | 2021.01.31 |
---|---|
[백준/C++]#10825 - 국영수 (0) | 2021.01.29 |
[백준/C++]#11650 - 좌표 정렬하기 (0) | 2021.01.27 |
[백준/C++]#2745 - 진법 변환 (0) | 2021.01.26 |
[백준/C++]#11005 - 진법 변환2 (0) | 2021.01.25 |