[C++] string의 문자 정렬

C++에서 문자열 클래스인 string의 문자들을 알파벳 순서로 정렬하는 방법을 소개합니다.

1. sort()함수로 string의 문자 정렬 (내림차순)

std::sort(first, last)처럼 문자열에서 정렬하려는 문자의 시작과 끝을 입력하면, 입력된 범위의 문자를 알파벳 순서로 내림차순 정렬합니다. 참고로 str.sort() 호출 시, str 객체가 정렬되면서 변경됩니다.

#include <iostream>
#include <string>
#include <algorithm>

int main() {

    std::string str = "Hello World";

    std::sort(str.begin(), str.end());

    std::cout << str << std::endl;

    return 0;
}

Output:

HWdellloor

2. sort()함수로 string의 문자 정렬 (오름차순)

오름차순으로 정렬하려면 std::sort(first, last, comparator)처럼 정렬 규칙이 정의된 comparator를 인자로 전달해야 합니다.

이미 정의된 std::greater<int>()를 comparator를 사용할 수 있으며, 이 객체를 전달하면 오름차순으로 정렬됩니다. C++ 14부터는 std::greater<>()처럼 타입을 생략하고 사용할 수 있습니다.

#include <iostream>
#include <string>
#include <algorithm>

int main() {

    std::string str = "Hello World";

    std::sort(str.begin(), str.end(), std::greater<int>());

    std::cout << str << std::endl;

    return 0;
}

Output:

roollledWH

3. 원본 문자열 변경 없이 문자 정렬

str.sort()으로 문자열 정렬 시, str의 문자들이 정렬되면서 변경됩니다. 즉, 원본 문자열 객체가 필요하다면 정렬하기 전에 복사해둬야 합니다.

아래 예제는 원본 문자열을 복사하고 복사된 문자열으로 정렬을 수행합니다.

#include <iostream>
#include <string>
#include <algorithm>

int main() {

    std::string str = "Hello World";

    std::string sorted = str;
    std::sort(sorted.begin(), sorted.end());

    std::cout << "str: " << str << std::endl;
    std::cout << "sorted: " << sorted << std::endl;

    return 0;
}

Output:

str: Hello World
sorted:  HWdellloor

4. 대소문자 구분 없이 문자 정렬

대소문자 구분 없이 문자를 정렬하려면, 정렬할 때 문자를 모두 소문자로 변경하거나 대문자로 변경해서 정렬하면 됩니다. 따라서, std::sort(first, last, comparator)를 호출할 때 comparator 인자를 직접 구현하여 전달해야하는데요. 아래와 같이 Lamba로 구현해서 인자로 전달할 수 있습니다.

아래 예제는 문자의 순서를 정렬할 때 std::tolower 함수로 문자를 소문자로 변경하여 비교하도록 하였습니다. 비교할 때 사용되는 문자만 소문자로 변경하고 계산하는 것이기 때문에, 실제 문자가 바뀌진 않습니다.

#include <iostream>
#include <string>
#include <algorithm>

int main() {

    std::string str = "Hello World";

    std::sort(str.begin(), str.end(),
            [](const char& char1, const char& char2) {
                return std::tolower(char1) < std::tolower(char2);
            }
    );

    std::cout << str << std::endl;

    return 0;
}

Output:

deHllloorW
Loading script...
codechachaCopyright ©2019 codechacha