신규아이디 추천
예를 들어, new_id 값이 "...!@BaT#*..y.abcdefghijklm" 라면, 위 7단계를 거치고 나면 new_id는 아래와 같이 변경됩니다.
1단계 대문자 'B'와 'T'가 소문자 'b'와 't'로 바뀌었습니다.
"...!@BaT#*..y.abcdefghijklm" → "...!@bat#*..y.abcdefghijklm"
2단계 '!', '@', '#', '*' 문자가 제거되었습니다.
"...!@bat#*..y.abcdefghijklm" → "...bat..y.abcdefghijklm"
3단계 '...'와 '..' 가 '.'로 바뀌었습니다.
"...bat..y.abcdefghijklm" → ".bat.y.abcdefghijklm"
4단계 아이디의 처음에 위치한 '.'가 제거되었습니다.
".bat.y.abcdefghijklm" → "bat.y.abcdefghijklm"
5단계 아이디가 빈 문자열이 아니므로 변화가 없습니다.
"bat.y.abcdefghijklm" → "bat.y.abcdefghijklm"
6단계 아이디의 길이가 16자 이상이므로, 처음 15자를 제외한 나머지 문자들이 제거되었습니다.
"bat.y.abcdefghijklm" → "bat.y.abcdefghi"
7단계 아이디의 길이가 2자 이하가 아니므로 변화가 없습니다.
"bat.y.abcdefghi" → "bat.y.abcdefghi"
따라서 신규 유저가 입력한 new_id가 "...!@BaT#*..y.abcdefghijklm"일 때, 네오의 프로그램이 추천하는 새로운 아이디는 "bat.y.abcdefghi" 입니다.
[문제]
신규 유저가 입력한 아이디를 나타내는 new_id가 매개변수로 주어질 때, "네오"가 설계한 7단계의 처리 과정을 거친 후의 추천 아이디를 return 하도록 solution 함수를 완성해 주세요.
[제한사항]
new_id는 길이 1 이상 1,000 이하인 문자열입니다.
new_id는 알파벳 대문자, 알파벳 소문자, 숫자, 특수문자로 구성되어 있습니다.
new_id에 나타날 수 있는 특수문자는 -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정됩니다.
[입출력 예]
예1 | "...!@BaT#*..y.abcdefghijklm" | "bat.y.abcdefghi" |
예2 | "z-+.^." | "z--" |
예3 | "=.=" | "aaa" |
예4 | "123_.def" | "123_.def" |
예5 | "abcdefghijklmn.p" | "abcdefghijklmn" |
#include <string>
#include <vector>
#include <iostream>
using namespace std;
bool check(char tmp)//false일 경우 들어갈 수 있는 문자가 아닌 것
{
bool answer=false;
if( (tmp >= 'a' && tmp <= 'z') || (tmp >='0' && tmp <= '9') || (tmp == '-' || tmp == '_' || tmp == '.') )
{
answer = true;
}
else answer = false;
return answer;
}
string solution(string new_id) {
string answer="";
for(int i=0; i< new_id.length(); i++)
{
if(new_id[i] <='Z' && new_id[i] >='A')// 1단계
{
char tmp = (new_id[i] -'A' +'a');
answer.push_back(tmp);
continue;
}
if(!check(new_id[i]))//2단계
{
continue;
}
if(check(new_id[i]))//2단계
{
if(new_id[i] != '.')
answer.push_back(new_id[i]);
}
if(new_id[i] == '.') //3단계
{
for(int j=i; j<new_id.length(); j++)
{
if(new_id[j] == '.')
{
continue;
}
else
{
answer.push_back('.');
i = j-1; break;
}
}
}
}
for(int i=0; i<answer.length();)
{
if (answer[i] == '.' && answer[i - 1] == '.')
{
answer.erase(answer.begin() + i);
continue;
}
else i++;
}
if(answer.front() == '.') answer.erase(answer.begin());//4단계
if(answer.back() == '.') answer.erase(answer.end() -1);
if(answer.length() >= 16) answer = answer.substr(0,15); //6단계
if(answer.back() == '.') answer.erase(answer.end() -1);//6단계-2
if(answer.length() == 0) answer='a';// 5단계
if(answer.length() <= 2) while(answer.length() != 3) answer += answer.back();//7단계
return answer;
}
=> 문제에서 주어진대로 단계대로 정규식을 하면 되는 문제입니다.
=> 단계대로 진행하다보면 "."과 "."이 붙어서 기대값과 실제 값이 다르게 나오는 경우가 있습니다.
=> 해당 경우를 해결하기 위해 for문을 한번 더 사용하여서 알고리즘을 수정하였습니다.
=> 위의 경우를 첫번째 for문에서 check 할 수 있는 방법이 있는지를 더 고민해봐야겠습니다.