문제 개요
이 문제에서는 하나의 문자열 str이 주어지며, 우리의 과제는 C++에서 문자열 내 가장 짧은 단어와 가장 긴 단어를 찾는 프로그램을 작성하는 것입니다.
문제 설명
주어진 문자열에 포함된 모든 단어 중에서 길이가 가장 짧은 단어와 가장 긴 단어를 각각 찾아야 합니다. 여기서 단어는 공백 문자(' ') 또는 널 문자('\0')를 기준으로 구분됩니다.
예시로 문제 이해하기
입력
str = "Learn Programming at TutorialsPoint"
출력
smallest word = at largest word = Tutorialspoint
해결 접근 방식
가장 짧은 단어와 가장 긴 단어를 찾으려면 두 개의 인덱스를 사용해 각 단어의 길이를 계산합니다. 첫 번째 인덱스는 단어의 시작 위치를, 두 번째 인덱스는 공백(' ') 또는 '\0' 문자로 표시되는 단어의 끝 위치를 가리킵니다.
구체적인 알고리즘은 다음과 같습니다.
- 두 인덱스(시작, 끝)를 사용해 현재 단어의 길이를 구합니다.
- 현재 단어의 길이가 기존의 최소 길이(minLength)보다 작으면 해당 단어를 smallestWord로 갱신합니다.
- 현재 단어의 길이가 기존의 최대 길이(maxLength)보다 크면 해당 단어를 largestWord로 갱신합니다.
- 문자열 끝까지 위 과정을 반복한 뒤 결과를 출력합니다.
C++ 구현 예제
아래 프로그램은 위에서 설명한 솔루션의 실제 동작을 보여줍니다.
예제 코드
#include<iostream>
#include<cstring>
using namespace std;
void minMaxLengthWords(string str){
int StrLength = str.length();
int startIndex = 0, endIndex = 0;
int minLength = StrLength, maxLength = 0, currentLength;
string smallest, largest;
while (endIndex <= StrLength){
if (str[endIndex] != '\0' && str[endIndex] != ' ')
endIndex++;
else{
currentLength = endIndex - startIndex;
if (currentLength < minLength){
smallest = str.substr(startIndex, currentLength);
minLength = currentLength;
}
if (currentLength > maxLength){
largest = str.substr(startIndex, currentLength);
maxLength = currentLength;
}
endIndex++;
startIndex = endIndex;
}
}
cout<<"가장 짧은 단어: "<<smallest<<"\n";
cout<<"가장 긴 단어: "<<largest;
}
int main() {
string a = "Learn Programming at TutorialsPoint";
minMaxLengthWords(a);
}실행 결과
가장 짧은 단어: at 가장 긴 단어: TutorialsPoint
코드 설명
이 프로그램은 문자열을 한 번만 순회하면서(시간 복잡도 O(n)) 각 단어의 경계를 탐색합니다. 공백이나 '\0' 문자를 만날 때마다 시작 인덱스부터 끝 인덱스까지의 거리를 계산해 현재 단어의 길이를 구하고, 이를 최소·최대 길이와 비교하여 조건에 맞으면 substr() 함수로 해당 단어를 추출해 저장합니다.
참고로 원본 예제 코드에는 마지막 출력 문에서 가장 긴 단어를 출력하면서도 "Smallest Word"라는 문구를 사용하는 오타가 있었는데, 위 코드에서는 이를 수정하여 정확한 결과를 출력하도록 개선했습니다.