https://programmers.co.kr/learn/courses/30/lessons/72410
#include <string>
#include <vector>
using namespace std;
string solution(string new_id)
{
//단계 1 : 모든 대문자를대응되는 소문자로 치환한다.
for (int i = 0; i < new_id.size(); i++)
{
if (new_id[i] >= 'A' && new_id[i] <= 'Z')
{
new_id[i] = tolower(new_id[i]);
}
}
//단계 2 : 알파벳 소문자, 숫자, 빼기, 밑줄 마침표 제외한 모든 문자 제거
for (int i = 0; i < new_id.size(); )
{
if ((new_id[i] >= 'a' && new_id[i] <= 'z') || (new_id[i] >= '0' && new_id[i] <= '9') || new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.')
{
i++;
continue;
}//나머지 문자들은 제외합니다.
new_id.erase(new_id.begin() + i);//지워지고 알아서 압축된다.
}
//단계 3 : . 이 2 번이상 나타나는 부분들은 .으로 치환합니다.
char cTemp = '.';
for (int i = 1; i < new_id.size(); )
{
if ((new_id[i] == cTemp) && (new_id[i - 1] == cTemp))
{
new_id.erase(new_id.begin() + i);
continue;
}
i++;
}
//단계 4 : new_id 에서 마침표가 처음이나 끝에 위치한다면 제거한다.
if (new_id.front() == '.') new_id.erase(new_id.begin());
if (new_id.back() == '.') new_id.erase(new_id.end() - 1); //마지막에서 -1해준 위치이다.
//단계 5 : 빈 문자열이라면 , "a"대입합니다.
if (new_id.size() == 0) new_id = "a";
//단계 6 : 16자 이상이라면, 15개 문자 제외한 나머지 모두 제외한다. 이후 마침표가 new_id의 끄텡 위치한다면 마지막 마침표 문자 제거합니다.
if (new_id.size() >= 16)
{
new_id.erase(new_id.begin() + 15, new_id.end());
if (new_id.back() == '.')
{
new_id.erase(new_id.begin() + 14);
}
}
// 단계 7 : 길이가 2자리 이하라면, new_id 마지막문자를 3이 될때까지 반복해서 끝에 붙인다.
char cTemp1 = new_id[new_id.size() - 1];
if (new_id.size() <= 2)
{
while (new_id.size() != 3)
{
new_id += cTemp1;
}
}
return new_id;
}
코테에 자주 나오는 문자열 유형입니다.
1.대문자 처리하기
if (new_id[i] >= 'A' && new_id[i] <= 'Z')
2.소문자 처리하기
if (new_id[i] >= 'a' && new_id[i] <= 'z')
3.문자열 삭제
//단계 3 : . 이 2 번이상 나타나는 부분들은 .으로 치환합니다.
char cTemp = '.';
for (int i = 1; i < new_id.size(); )
{
if ((new_id[i] == cTemp) && (new_id[i - 1] == cTemp))
{
new_id.erase(new_id.begin() + i);
continue;
}
i++;
}
4.front / back / begin / end 사용하기
if (new_id.front() == '.') :: 주소값아님. 실제값
if (new_id.back() == '.')
new_id.begin(); :: 주소값이다.
new_id.end(); :: 주소값이다.
전체적인 문자열 다루기 문제