[백준/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가 들어간다.