▶ [STL 알고리즘] sort - 구조체 정렬
알고리즘 문제를 해결하다보면 구조체를 정렬해야 할 경우가 생긴다.
STL 알고리즘 중에 컨테이너를 정렬해주는 sort가 있다. 이를 활용하여 구조체를 정렬하는 방법을 알아보자.
이해하기 쉽도록 간단한 문제를 만들어서 sort를 사용해 문제를 해결하는 과정을 설명하려한다.
▶ 문제
우리는 사람 10명의 이름, 나이, 키, 몸무게를 알고있다.
10명의 사람들 중 모델이 될 사람을 뽑아야 한다.
그래서 키가 가장 크고, 몸무게가 적게 나가면서, 어린 사람을 찾으려 한다.
키가 큰 사람을 우선하는데, 키가 같은 경우에는 몸무게가 적은 사람을 우선하고,
키가 같으면서 몸무게도 같은 경우에는 어린 사람을 우선한다.
STL 알고리즘 중 sort를 활용해서 문제를 해결하라.
▶ 설계
우선 Person 구조체를 만들어보자.
1 2 3 4 | struct Person{ string name; int age, height, weight; }persons[10]; | cs |
이런 구조체를 만들면 사람 한명에 대한 정보를 묶어서 관리할 수 있게 된다.
sort()를 이용해 정렬하기위해 어떤 비교 함수를 구현해야 할까?
1 2 3 4 5 6 7 8 9 10 11 | bool compare(const Person& p1, const Person& p2){ if(p1.height == p2.height){ if(p1.weight == p2.weight){ return p1.age < p2.age; } else return p1.weight < p2.weight; } else return p1.height > p2.height; } | cs |
부등호의 방향이 헛갈린다면 병합 정렬 알고리즘을 생각해보자.
왼쪽과 오른쪽으로 각각 정렬된 배열이 있을 때,
앞에서부터 왼쪽 배열의 값은 L로, 오른쪽 배열의 값은 R로 가리킨다고 하자.
두 배열을 합치면서 비교하게 되는데
L과 R을 비교 함수의 인자로 순서대로 넣어 호출했을 때 ( compare(L,R) )
true를 반환하면 L, false를 반환하면 R이 합쳐진 배열의 가장 앞에 오도록 구현되어있다고 생각하면 된다.
즉, 비교함수로 compare함수를 인자로 넘겨주면 배열의 0번 인덱스에 원하는 사람이 있게 된다.
▶ 구현
코드 상단에 #include<algorithm>을 추가해주었다.
algorithm에 sort함수가 정의되어 있기 때문이다.
작성된 메인문을 보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 | int main(){ freopen("input.txt","r",stdin); for(int i=0; i<NUM_PERSONS ;i++){ Person& p = persons[i]; cin >> p.name >> p.age >> p.height >> p.weight; } printArray(persons, NUM_PERSONS); sort(persons, persons+NUM_PERSONS, compare); printArray(persons, NUM_PERSONS); cout<< "answer :" << persons[0].name << endl; return 0; } | cs |
정렬이 이루어지는 부분은 8번째 라인 한 줄 뿐이다.
첫 번째 인자 : 정렬을 수행할 배열의 이름 ( 배열의 시작주소, vector의 begin() )
두 번째 인자 : 정렬을 수행할 배열의 마지막 인덱스의 주소값 + 1 ( 배열의 끝주소, vecctor의 end() )
얼마나 편리한가?
이처럼 STL 함수 사용 방법을 익혀두는 것은 매우 중요하다.
▶ 결과
▶Solution
'■ C++ > STL 알고리즘' 카테고리의 다른 글
대소문자를 구분하지 않는다는 조건에 대하여 (대/소문자 변경) (0) | 2020.04.23 |
---|---|
[C++] next_permutation()을 활용한 조합 생성 (0) | 2019.03.26 |
[C++] STL vector를 활용한 배열 동적 할당 (0) | 2019.03.26 |