Among Us - Crewmates
 

[C++] std::string::erase 문자열에서 일부 문자 지우기

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

 

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

Programmers 2021 Kakao Blind Recruitment [신규 아이디 추천] 난이도 : 1단계 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다. 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(..

saying-me.tistory.com

 

2단계를 해결하기 위해서는 1단계로부터 얻어낸 소문자 문자열에서

( 알파벳 소문자 / 숫자 / - / _ / . ) 이 문자들을 제외한 나머지를 모두 제거해야 했다.

 

  • std::string::erase
    1. sequence
      string& erase (size_t pos = 0, size_t len = npos);​
      문자열 내에서 지우려는 범위의 시작위치를 pos로 설정하고,
      len의 크기만큼 지운다.
    2. character
      iterator erase (iterator p);​
      p가 가리키는 문자를 지운다.
    3. range
      iterator erase (iterator first, iterator last)​
       first 부터 last 까지의 문자들을 지운다. 단, last는 포함하지 않는다.

 

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
반응형