C++ 프로그래밍에서는 std::sort()와 같은 표준 라이브러리 함수뿐만 아니라 다양한 방법으로 문자열을 오름차순 또는 내림차순으로 정렬할 수 있습니다. 이 글에서는 strcmp()(두 문자열 비교)와 strcpy()(첫 번째 단어를 임시 변수에 복사) 함수를 활용한 버블 정렬 방식을 통해 문자열 배열을 내림차순으로 정렬하는 원리를 살펴보겠습니다.
정렬 원리
바깥쪽 반복문과 안쪽 반복문을 중첩하여 인접한 두 문자열을 strcmp()로 비교합니다. 앞의 문자열이 뒤의 문자열보다 사전순으로 앞선다면(strcmp 결과가 0보다 클 때), 임시 변수 t를 거쳐 두 문자열의 위치를 서로 맞바꿉니다. 이 과정을 배열 전체에 걸쳐 반복하면 배열이 오름차순으로 정렬되고, 이를 역순으로 출력하면 내림차순 결과를 얻을 수 있습니다.
예제 코드
#include<bits/stdc++.h>
using namespace std;
int main(){
char str[3][20]={"Ajay","Ramesh","Mahesh"};
char t[20];
int i, j;
for(i=1; i<3; i++){
for(j=1; j<3; j++){
if(strcmp(str[j-1], str[j])>0){
strcpy(t, str[j-1]);
strcpy(str[j-1], str[j]);
strcpy(str[j], t);
}
}
}
cout<<"Sorted in Descending Order ::";
for(i=2; i>=0; i--){
cout<<" ";
cout<<str[i]<<" ";
}
return 0;
}
실행 결과
이 프로그램은 세 개의 단어(Ajay, Ramesh, Mahesh)가 저장된 배열을 내림차순으로 정렬한 후 아래와 같은 결과를 출력합니다.
Sorted in Descending Order::
Ramesh
Mahesh
Ajay
현대적인 C++ 대안
현대적인 C++에서는 std::string과 std::sort(), 그리고 std::greater를 함께 사용하면 위 코드를 훨씬 간결하게 구현할 수 있습니다.
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<string> v = {"Ajay","Ramesh","Mahesh"};
sort(v.begin(), v.end(), greater<string>());
cout<<"Sorted in Descending Order ::";
for(auto& s : v)
cout<<s<<" ";
return 0;
}
std::sort()에 greater<string>() 비교자를 전달하면 별도의 역순 출력 없이 곧바로 내림차순으로 정렬되므로, 실무에서는 이 방식을 권장합니다.