본문 바로가기

알고리즘 시*련아

C++ STL sort() - 정렬6

물론 나는 대회 발끝에도 닿아보지 못한 사람이다

하지만 나는 상당히 이상적인 사람이다.

 

이상적인 사람의 특징은 지금 당장은 쓸모가 없어도 

나중에 필요할거 같다면서 요긴해 보이면 모든지 가져간다는 것이다.

(적어도 나는 그렇다)

 

아무튼 오늘  배운 STL sort()도 그런것이다.

 

나의 은사 동빈나 선생님이 말씀하시길 알고리즘 대회에서 자신이 직접 정렬 알고리즘을 짜는것은 시간 낭비라고 하셨다.

유튜브에서 그대로 배껴온 내 정렬 알고리즘 대신

몇 십년간의 진화를 거듭해온 컴퓨터과학의 로니콜먼같은 사람이 먼저 만들어 놓은 

C++ 표준라이브러리의 sort()를 사용하는것이 현명하다.

 

기본적인 사용법이다

#include <iostream>
#include <algorithm>	//STL 함수들을 사용하려면 꼭 추가해 주어야 한다

using namespace std;
int main(void){
    int arr[] = {5, 2, 3, 1, 4};
    
    sort(arr, arr+5);	//배열의 주소, 배열의 끝주소
    
    for(int i=0; i<5; i++){
        printf("%d\n", arr[i]);
    }
}

출력
1
2
3
4
5

sort(*int, *int)에 배열의 시작 주소, 그리고 끝주소를 넣어주면 된다.

이 sort()는 기본적으로 오름차순으로 정렬을 해준다.

 

하지만 오름차순이 아니라 내림차순으로 정렬을 하고 싶으면 어떨까

그때는 우리가 조건을 정의해주면 된다

bool Compare(int a, int b){	//a는 왼쪽값 b는 오른쪽값이라고 생각하면 된다
    				//내림차순은 왼쪽값이 더 커야 하므로 
    return a > b;	//왼쪽값이 더 클때 true 리턴
    
}

using namespace std;
int main(void){
    int arr[] = {5, 2, 3, 1, 4};
    
    sort(arr, arr+5, Compare); // 마지막에 조건 함수 추가
    
    for(int i=0; i<5; i++){
        printf("%d\n", arr[i]);
    }
}

위에 보이는 코드처럼 조건을 리턴해주는 함수를 정의하면 된다.

위의 조건 함수의 매개변수 a와 b는 각각 왼쪽값과 오른쪽 값을 나타내는데,

내림차순은 왼쪽 값이 더 크다는 뜻이므로

왼쪽값이 더 클때 true를 리턴해주면 된다

 

이렇게 간단한 조건을 넣어줄 수 도 있지만, 더욱 복잡한 조건도 가능하다는 것도 알아두면 좋을것 같다.

 

 

이 놀라운 녀석은 사실 이게 끝이 아니다.

물론 나는 실무의 발끝에도 도달하지 못했지만 실무에서는 데이터를 변수 하나하나로 처리하지 않고 

클래스의 단위로 묶어서 처리하는것이 일반적이라고 한다.

 

이 sort는 클래스에도 적용이 가능하다.

그렇기 위해서는 해당 클래스의 정렬 기준을 정해주어야 한다.

#include <iostream>
#include <algorithm>


using namespace std;

class Student{
public:
    string name;
    int age;
    int grade;
    Student(string name, int age, int grade){
        this->name = name;
        this->age = age;
        this->grade = grade;
    }

    bool operator <(const Student &student)const {	//연산자 오버로딩을 통해서 정렬 기준 정의
        return this->grade > student.grade;	//점수기준 내림차순
    }
};

int main(void){
    Student students[] = {Student("이아무개", 19, 80),
                        Student("김아무개", 18, 90),
                        Student("박아무개", 19, 100),
                        Student("최아무개", 19, 60),
        };
        
    sort(students, students+4);
    
    for(int i=0; i<4; i++){
        cout << students[i].name << '\n';
    }
}

출력
박아무개
김아무개
이아무개
최아무개

클래스의 연산자를 오버로딩을 하면 정렬 기준을 정할 수 있다

 

 

 

아무 요긴한것이 아닐 수가 없다.

자주 써먹어야 겠다

'알고리즘 시*련아' 카테고리의 다른 글

백준 시간 초과와 시간 복잡도  (0) 2022.11.04
C++ 백준 1008번에 관해  (0) 2022.10.27
C++ 병합 정렬(합병 정렬) - 정렬5  (0) 2022.08.05
C++ 퀵정렬 - 정렬4  (0) 2022.08.05
C++ 삽입 정렬 - 정렬3  (0) 2022.08.04