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이 될 때까지 반복해서 끝에 붙입니다.
지난 번 포스팅에선 대문자와 소문자 간 변환을 알아보았다.
https://saying-me.tistory.com/6
2단계를 해결하기 위해서는 1단계로부터 얻어낸 소문자 문자열에서
( 알파벳 소문자 / 숫자 / - / _ / . ) 이 문자들을 제외한 나머지를 모두 제거해야 했다.
- std::string::erase
- sequence
string& erase (size_t pos = 0, size_t len = npos);
문자열 내에서 지우려는 범위의 시작위치를 pos로 설정하고,len의 크기만큼 지운다. - character
p가 가리키는 문자를 지운다.iterator erase (iterator p);
- range
first 부터 last 까지의 문자들을 지운다. 단, last는 포함하지 않는다.iterator erase (iterator first, iterator last)
- sequence
string::erase - C++ Reference (cplusplus.com)를 참고하여 작성하였다.
이제 이를 이용하여 2단계를 풀이해보았다.
// 탐색하고자 하는 문자열 answer를 길이 length 만큼 검사한다.
for (int i = 0; i < answer.length(); i++)
{
// a보다 크거나 z 보다 작은 경우는 소문자를 의미한다.
// 0보다 크거나 9 보다 작은 경우는 숫자를 의미한다.
if ((answer[i] >= 'a' && answer[i] <= 'z') ||
(answer[i] >= '0' && answer[i] <= '9') ||
answer[i] == '-' || answer[i] == '_' || answer[i] == '.')
continue;
// 제외된 문자가 아닌 경우
else
{
// 문자열 answer에서 erase를 이용하여 제거한다.
answer.erase(answer.begin() + i);
i--;
}
}
for문을 통해 문자열을 처음 0번째부터 문자열의 길이만큼 검사한다.
제외된 문자가 아닌 경우, 문자열 answer에서 erase를 이용하여 제거한다.
answer.begin() + i 는 처음 시작 위치로부터 i 번째의 문자임을 의미한다.
이 때 주의해야할 부분은 바로 다음 문장이다.
문자열에서 erase 함수를 이용해 특정 문자를 제거하고 나면 제거된 문자의 다음 문자 위치가 앞으로 당겨지기 때문에,
반드시 이에 대한 처리를 해 주어야 한다.
예를 들어 "hello world" 라는 문장이 있을 때 1 번째 위치부터 여섯 문자를 제거하였다고 하자.
h가 0 번째 이므로 "horld" 가 얻어지며 자연스럽게 문자 o는 1 번째 위치로 당겨진 것을 확인할 수 있다.
필자는 i--; 를 추가하여 이에 대한 처리를 해주었다.
728x90
반응형
'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++] String 대문자 소문자 간 변환 방법 (0) | 2022.01.09 |