주어진 문자열 목록을 영숫자(alphanumeric) 순서, 즉 사전(Dictionary) 순서로 정렬하는 방법을 소개합니다. 예를 들어 Apple, Book, Aim이라는 세 단어가 있을 때, 정렬 결과는 Aim → Apple → Book 순이 됩니다. 목록에 숫자가 섞여 있는 경우에는 숫자로 시작하는 문자열이 알파벳 문자열보다 앞쪽에 배치됩니다.
입력 및 출력
입력: 문자열 목록: Ball Apple Data Area 517 April Man 506 출력: 정렬 후 문자열: 506 517 Apple April Area Ball Data Man
알고리즘
sortStr(strArr, n)
입력: 전체 문자열 목록과 요소 개수 n
출력: 영숫자 순서로 정렬된 문자열 배열
Begin
for round := 1 to n-1, do
for i := 0 to n-round, do
res := compare str[i] and str[i+1] // 양수, 음수 또는 0
if res > 0, then
swap str[i] and str[i+1]
done
done
End
이 알고리즘은 버블 정렬(Bubble Sort) 방식을 기반으로 합니다. 인접한 두 문자열을 비교했을 때 앞쪽 문자열이 뒤쪽 문자열보다 사전 순서상 뒤에 온다면(비교 결과가 양수라면) 두 문자열의 자리를 서로 바꿉니다. 한 번의 순회가 끝나면 가장 큰 값이 맨 뒤로 이동하며, 이 과정을 n-1회 반복하면 전체 목록이 정렬됩니다.
C++ 구현 예제
#include<iostream>
#define N 8
using namespace std;
void display(int n, string str[]) {
for(int i = 0; i<n; i++)
cout << str[i] << " "; // 배열의 문자열을 출력
cout << endl;
}
void sortStr(int n, string str[]) {
int i, round, res;
for(round = 1; round<n; round++)
for(i = 0; i<n-round; i++) {
res = str[i].compare(str[i+1]);
if(res > 0)
swap(str[i], str[i+1]); // 문자열 위치 교환
}
}
main() {
string str[N] = {"Ball", "Apple", "Data", "Area", "517", "April", "Man", "506"};
cout << "Strings before sort:" << endl;
display(N, str);
sortStr(N, str);
cout << "Strings after sort:" << endl;
display(N, str);
}
실행 결과
Strings before sort: Ball Apple Data Area 517 April Man 506 Strings after sort: 506 517 Apple April Area Ball Data Man
동작 원리
str[i].compare(str[i+1]) 함수는 두 문자열을 사전 순서로 비교하여 다음 세 가지 값 중 하나를 반환합니다.
- 0: 두 문자열이 동일한 경우
- 음수: str[i]가 str[i+1]보다 사전 순서상 앞에 오는 경우
- 양수: str[i]가 str[i+1]보다 사전 순서상 뒤에 오는 경우
숫자로 시작하는 문자열("506", "517")이 알파벳 문자열보다 먼저 오는 이유는, ASCII 코드에서 숫자 문자('0'~'9', 48~57)가 대문자('A'~'Z', 65~90)보다 작은 값을 가지기 때문입니다. 따라서 별도의 처리 없이 기본적인 문자열 비교만으로도 숫자 → 알파벳 순서의 영숫자 정렬이 자연스럽게 이루어집니다.