BOJ

(C++) BOJ/백준 10814 - 나이순 정렬

정영주 2021. 4. 3. 20:33

문제 출처 : BOJ 10814 - 나이순 정렬 www.acmicpc.net/problem/10814

 

 

오늘의 마지막 문제이다. sort()라는 또다른 엄청난 기능을 배웠다.

되게 간단하면서도 복잡한데, 일단 sort()는 정렬 알고리즘이다.

sort(a, b)는 [a, b)까지 오름차순으로 정렬한다.

 

오름차순이 싫으면 마지막에 parameter로 bool type의 function을 추가할 수 있다.

 

원래 있던 걸 써도 되고, 새로 만들어서 써도 되는데,

원래 있던 것을 쓰려면 <functional>을 include한 후에, less<type> 또는 greater<type>을 사용하면 된다.

less<type>은 첫번째 원소가 두번째 원소보다 작으면 true를 반환한다. 즉, 오름차순으로 정렬한다.

greater<type>은 첫번째 원소가 두번째 원소보다 크면 true를 반환. 즉, 내림차순으로 정렬한다.

 

새로 만들어서 쓰려면 bool type을 return하는 함수를 만들어줘야 한다.

이 경우는 이 문제를 해결한 아래의 코드를 참고하면 좋다.

 

이 문제는 나이, 이름을 받고, 나이를 오름차순으로, 나이가 같으면 가입한 순서를 오름차순으로 정렬하는 문제이다.

 

최종 코드

#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 100000

struct member {
	int age;
	string name;
	int join;
} m[MAX];

bool f(member a, member b) {
	if (a.age == b.age) return a.join < b.join;
	else return a.age < b.age;
}

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> m[i].age >> m[i].name;
		m[i].join = i;
	}
    
	sort(m, m + n, f);
    
	for (int i = 0; i < n; i++)
		cout << m[i].age << ' ' << m[i].name << '\n';
        
	return 0;
}

 

위 코드에서처럼 bool type을 return하는 f()함수를 만들어줬다.

f() 함수에서 각 member 구조체의 나이가 같은지 비교한 후에,

같으면 가입 순서를 비교한 결과의 bool type을 비교하고, 다르면 나이를 비교한 결과의 bool type을 반환한다.

 

저렇게 return type이 true인 순서대로 정렬이 된다.

'BOJ' 카테고리의 다른 글

(C++) BOJ/백준 2751 - 수 정렬하기 2  (0) 2021.04.04
(C++) BOJ/백준 10828 - 스택  (0) 2021.04.04
(C++) BOJ/백준 4358 - 생태학  (0) 2021.04.03
(C++) BOJ/백준 1158 - 요세푸스 문제  (0) 2021.04.03
(C++) BOJ/백준 3986 - 좋은 단어  (0) 2021.04.03