Among Us - Crewmates
 

[C++] String 대문자 소문자 간 변환 방법

728x90
Programmers 2021 Kakao Blind Recruitment [신규 아이디 추천]
난이도 : 1단계

 

 

1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
        만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

 

위 문제의 1단계를 해결하고자 이곳저곳에서 많은 정보를 수집하였다.

총 세 가지의 방법을 소개한다.

 

  • Boost를 이용하는 방법
#include <boost/algorithm/string.hpp>

// 원본 str도 동시에 변경
// 1) 소문자 -> 대문자
boost::algorithm::to_upper(str);

// 2) 대문자 -> 소문자
boost::algorithm::to_lower(str);


// 원본 str은 변경 x
// 1) 소문자 -> 대문자
boost::algorithm::to_upper_copy(str);

// 2) 대문자 -> 소문자
boost::algorithm::to_lower_copy(str);

 

먼저 boost란 무엇인가?

 

C++ STL(Standard Tamplate Library)를 확장시킨 것인데, Boost의 로고 이미지만 보아도 library가 아닌 libraries로 표기된 것을 알 수 있다. 그 만큼 개발에 있어서 필요한 방대한 양의 정보를 담고 있다.

( 이에 대한 내공이 크지 않기 때문에 간략하게 적어보았다. 자세한 건 다음에 공부해 볼 계획 )

굉장히 편리해 보여서 처음에는 이 방법을 이용해 보려 하였으나

이는 Windows가 별도로 Boost 환경을 다운받아 설치해야 하는 것 같았다. 

단순히 알고리즘 문제를 푸는 것이기 때문에 이 방법은 잠시 접어두었지만,

언젠가 기회가 된다면 다운 받아 사용해 볼 예정이다.

 

  • #include <algorithm> 지시문을 이용하는 방법
#include <algorithm>

using namespace std;

// 원본 str도 동시에 변경
// 1) 소문자 -> 대문자
transform(str.cbegin(), str.cend(), str.begin(), toupper);

// 2) 대문자 -> 소문자
transform(str.cbegin(), str.cend(), str.begin(), tolower);


// 원본 str은 변경 x
// 1) 소문자 -> 대문자
string upper = string(str.length(), '\0');
transform(str.cbegin(), str.cend(), upper.begin(), toupper);

// 2) 대문자 -> 소문자
string lower = string(str.length(), '\0');
transform(str.cbegin(), str.cend(), lower.begin(), tolower);

 

C++에서 기본적으로 제공하는 std::toupper 와 std::tolower 방식을 사용한 코드이다.

하지만 programmers에서는 기본으로 기재된 지시문으로만 코드를 작성하여야 했기 때문에,

추가적으로 #include <algorithm>을 사용할 수가 없었다.

때문에 하단에 작성한 별도의 지시문 없이 대문자/소문자 간 변환하는 방식을 사용하였다.

 

  • 별도의 지시문 없이 하는 방법
// 1) 대문자 -> 소문자

string lower = "";
lower = string(str.length(), '\0');
for(int i = 0; i< str.length(); i++)
	lower[i] = tolower(str[i]);
    
// 2) 소문자 -> 대문자

string upper = "";
upper = string(str.length(), '\0');
for(int i = 0; i< str.length(); i++)
	upper[i] = tolower(str[i]);​

 

lower[i] = tolower(str[i]); 만으로도 구현이 가능한 것을 확인 할 수 있었다.

str의 길이만큼 인덱스를 돌며, 해당 인덱스를 tolower() 하여 새로운 string lower의 같은 인덱스에 대입하는 방식이다.

 

 

소문자와 대문자 간 변환에 대해 알아보았다.

 

다음 포스팅에선 문자열 내 일부 문자를 제거하는 방법을 다뤄보고자 한다.

728x90
반응형