icon안동민 개발노트

문자열 처리 프로그램 작성


실습 개요

 이번 실습에서는 5장에서 학습한 배열과 문자열 관련 개념을 종합적으로 적용하여 실제 문자열 처리 프로그램을 작성해 보겠습니다. 이를 통해 1차원 배열, 다차원 배열, C 스타일 문자열, 그리고 std::string 클래스의 사용법을 실제로 적용해 볼 수 있습니다.

프로그램 요구사항

 다음 기능을 가진 문자열 처리 프로그램을 작성하세요.

  1. 사용자로부터 여러 문자열을 입력받아 저장
  2. 저장된 문자열들을 알파벳 순으로 정렬
  3. 특정 문자열 검색 기능 구현
  4. 모든 문자열을 대문자로 변환하는 기능 구현
  5. 가장 긴 문자열과 가장 짧은 문자열 찾기

프로그램 구조

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
 
void inputStrings(std::vector<std::string>& strings);
void sortStrings(std::vector<std::string>& strings);
bool searchString(const std::vector<std::string>& strings, const std::string& target);
void convertToUppercase(std::vector<std::string>& strings);
void findLongestAndShortest(const std::vector<std::string>& strings);
void printStrings(const std::vector<std::string>& strings);
 
int main() {
    std::vector<std::string> strings;
    
    // 메인 로직 구현
    
    return 0;
}
 
// 아래부터 함수를 구현하세요.

주요 함수 구현

 문자열 입력 받기

void inputStrings(std::vector<std::string>& strings) {
    std::string input;
    std::cout << "문자열을 입력하세요 (입력을 마치려면 빈 줄을 입력하세요):" << std::endl;
    while (std::getline(std::cin, input) && !input.empty()) {
        strings.push_back(input);
    }
}

 이 함수는 사용자로부터 여러 줄의 문자열을 입력받아 vector에 저장합니다. 빈 줄이 입력되면 입력이 종료됩니다.

 문자열 정렬

void sortStrings(std::vector<std::string>& strings) {
    std::sort(strings.begin(), strings.end());
}

 이 함수는 std::sort 알고리즘을 사용하여 문자열들을 알파벳 순으로 정렬합니다.

 문자열 검색

bool searchString(const std::vector<std::string>& strings, const std::string& target) {
    return std::find(strings.begin(), strings.end(), target) != strings.end();
}

 이 함수는 std::find 알고리즘을 사용하여 특정 문자열을 검색합니다.

 대문자 변환

void convertToUppercase(std::vector<std::string>& strings) {
    for (std::string& str : strings) {
        for (char& c : str) {
            c = std::toupper(c);
        }
    }
}

 이 함수는 모든 문자열의 각 문자를 대문자로 변환합니다.

 가장 긴 / 짧은 문자열 찾기

void findLongestAndShortest(const std::vector<std::string>& strings) {
    if (strings.empty()) {
        std::cout << "문자열이 없습니다." << std::endl;
        return;
    }
 
    auto [minIt, maxIt] = std::minmax_element(strings.begin(), strings.end(),
        [](const std::string& a, const std::string& b) {
            return a.length() < b.length();
        });
 
    std::cout << "가장 짧은 문자열: " << *minIt << std::endl;
    std::cout << "가장 긴 문자열: " << *maxIt << std::endl;
}

 이 함수는 std::minmax_element 알고리즘을 사용하여 가장 짧은 문자열과 가장 긴 문자열을 찾습니다.

 문자열 출력

void printStrings(const std::vector<std::string>& strings) {
    for (const auto& str : strings) {
        std::cout << str << std::endl;
    }
}

 이 함수는 저장된 모든 문자열을 출력합니다.

메인 함수 구현

int main() {
    std::vector<std::string> strings;
    
    inputStrings(strings);
    
    std::cout << "\n입력된 문자열:" << std::endl;
    printStrings(strings);
    
    sortStrings(strings);
    std::cout << "\n정렬된 문자열:" << std::endl;
    printStrings(strings);
    
    std::string searchTarget;
    std::cout << "\n검색할 문자열을 입력하세요: ";
    std::getline(std::cin, searchTarget);
    if (searchString(strings, searchTarget)) {
        std::cout << "'" << searchTarget << "' 찾았습니다." << std::endl;
    } else {
        std::cout << "'" << searchTarget << "' 찾지 못했습니다." << std::endl;
    }
    
    convertToUppercase(strings);
    std::cout << "\n대문자로 변환된 문자열:" << std::endl;
    printStrings(strings);
    
    findLongestAndShortest(strings);
    
    return 0;
}

실행 예시

문자열을 입력하세요 (입력을 마치려면 빈 줄을 입력하세요):
apple
banana
cherry
date
 
입력된 문자열:
apple
banana
cherry
date
 
정렬된 문자열:
apple
banana
cherry
date
 
검색할 문자열을 입력하세요: banana
'banana' 찾았습니다.
 
대문자로 변환된 문자열:
APPLE
BANANA
CHERRY
DATE
 
가장 짧은 문자열: DATE
가장 긴 문자열: BANANA

실습

  1. 문자열 내 특정 문자의 개수를 세는 기능을 추가하세요.
  2. 문자열을 역순으로 정렬하는 옵션을 구현하세요.
  3. 중복된 문자열을 제거하는 기능을 구현하세요.
  4. 각 문자열의 길이를 함께 출력하는 기능을 추가하세요.
  5. 문자열 일부를 다른 문자열로 치환하는 기능을 구현하세요.

학습 포인트

  • std::vector와 std::string의 조합 사용
  • STL 알고리즘(std::sort, std::find, std::minmax_element)의 활용
  • 범위 기반 for 루프의 사용
  • 람다 함수의 기본적인 사용
  • 문자열 처리 함수들의 실제 적용

주의사항

  • 입력 검증의 중요성 : 사용자 입력에 대한 적절한 검증을 수행하세요.
  • 메모리 관리 : 대용량 데이터 처리 시 메모리 사용에 주의하세요.
  • 예외 처리 : 프로그램의 안정성을 위해 적절한 예외 처리를 추가하세요.
  • 성능 고려 : 대량의 문자열을 처리할 때 성능 최적화 방법을 고민해보세요.


참고 자료