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의 같은 인덱스에 대입하는 방식이다.
소문자와 대문자 간 변환에 대해 알아보았다.
다음 포스팅에선 문자열 내 일부 문자를 제거하는 방법을 다뤄보고자 한다.
'Algorithm > C,C++' 카테고리의 다른 글
[Programmers] C++ 스택/큐 - 같은 숫자는 싫어 (0) | 2023.12.30 |
---|---|
[Programmers] C++ 해시 / 완주하지 못한 선수 (0) | 2023.12.29 |
[C++ 알고리즘] 코딩테스트에 유용한 알고리즘 코드 모음 (0) | 2023.03.04 |
[Baekjoon] C++ 백준 25501 - 재귀의귀재 (0) | 2023.03.01 |
[C++] std::string::erase 문자열에서 일부 문자 지우기 (0) | 2022.01.12 |