사전순 정렬이란?
사전순(Lexicographical order)은 목록에 있는 단어들을 알파벳 순서를 기준으로 배열하는 방식을 의미합니다. 영어 사전에서 단어가 배치되는 순서와 동일한 개념입니다. 예를 들어 다음과 같습니다.
단어 목록:
Harry
Adam
Sam
사전순으로 정렬된 단어:
Adam
Harry
Sam
이번 글에서는 C++를 사용하여 사용자가 입력한 여러 개의 문자열을 사전순으로 정렬하는 프로그램을 살펴보겠습니다.
C++ 예제 코드
요소를 사전순으로 정렬하는 프로그램은 다음과 같습니다.
#include <iostream>
using namespace std;
int main() {
int i,j;
string s[5], temp;
cout<<"Enter the elements..."<<endl;
for(i = 0; i < 5; ++i)
getline(cin, s[i]);
for(i = 0; i < 4; ++i)
for(j = i+1; j < 5; ++j) {
if(s[i] > s[j]) {
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
cout << "The elements in lexicographical order are... " << endl;
for(int i = 0; i < 5; ++i)
cout << s[i] << endl;
return 0;
}
실행 결과
위 프로그램을 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
Enter the elements…
Orange
Grapes
Mango
Apple
Guava
The elements in lexicographical order are...
Apple
Grapes
Guava
Mango
Orange
코드 상세 설명
1. 문자열 입력 받기
먼저 크기가 5인 문자열 배열 s[]와 임시 변수 temp를 선언합니다. 그다음 getline() 함수를 사용하여 사용자로부터 5개의 문자열을 입력받습니다. 공백이 포함된 문자열도 처리할 수 있도록 cin 대신 getline(cin, s[i])을 사용했습니다.
string s[5], temp;
cout<<"Enter the elements..."<<endl;
for(i = 0; i < 5; ++i)
getline(cin, s[i]);
2. 버블 정렬(Bubble Sort)로 알파벳 순 정렬
입력받은 문자열들은 중첩 for 루프를 이용해 알파벳 순서대로 정렬됩니다. C++에서는 비교 연산자 >를 문자열에 적용하면 사전순 비교가 수행되므로, 앞의 문자열이 뒤의 문자열보다 크면 두 값을 서로 교환(swap)합니다. 이 과정을 반복하면 전체 배열이 오름차순으로 정렬됩니다.
for(i = 0; i < 4; ++i)
for(j = i+1; j < 5; ++j) {
if(s[i] > s[j]) {
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
3. 정렬 결과 출력
마지막으로 사전순으로 정렬된 모든 요소를 화면에 출력합니다.
cout << "The elements in lexicographical order are... " << endl;
for(int i = 0; i < 5; ++i)
cout << s[i] << endl;
마무리
이 프로그램은 선택 정렬과 유사한 방식으로 중첩 루프를 활용해 문자열 배열을 사전순으로 정렬하는 기본적인 예제입니다. C++ 표준 라이브러리(STL)를 활용한다면 std::sort(s, s + 5) 한 줄만으로도 동일한 결과를 얻을 수 있으며, 더 많은 데이터를 처리할 때는 STL의 sort 함수가 훨씬 효율적입니다. 하지만 정렬 알고리즘의 원리를 이해하는 데는 이러한 직접 구현 방식이 매우 유용한 학습 자료가 됩니다.