Recent Posts
Notice
No Rules Rules
신규 아이디 추천 (feat. 프로그래머스, 72410번) 본문
728x90
반응형
// woohyeon.kim
#include <string>
#include <vector>
#include <cctype>
#include <algorithm>
#include <iostream>
using namespace std;
string solution(string new_id) {
// 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
transform(new_id.begin(), new_id.end(), new_id.begin(), ::tolower);
// 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
for(auto idx = 0; idx < new_id.size(); ++idx)
{
auto& new_id_char = new_id.at(idx);
if(!islower(new_id_char) &&
!isdigit(new_id_char) &&
(new_id_char != '-') &&
(new_id_char != '_') &&
(new_id_char != '.'))
{
new_id.erase(idx--, 1);
}
}
// 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
size_t position = 0;
while((position = new_id.find("..")) != string::npos)
{
new_id.replace(position, 2, ".");
}
// 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
if(new_id.front() == '.')
{
new_id.erase(new_id.begin());
}
if(new_id.back() == '.')
{
new_id.pop_back();
}
// 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
if(new_id.empty())
{
new_id = "a";
}
// 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다. 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
if(new_id.size() >= 16)
{
new_id = new_id.substr(0, 15);
if(new_id.back() == '.')
{
new_id.pop_back();
}
}
// 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
while(new_id.size() < 3)
{
new_id.push_back(new_id.back());
}
cout << new_id << endl;
return new_id;
}
// *&)*@*
혹시 3,4,5번 케이스가 실패라면, 4번 조건을 확인해보세요.
if ~ else if 로 하면 아마 실패할껍니다.
else if 로 조건을 둔다면, ".1." -> "1.." 로 치환되는 재앙이 시작됩니다.
ps. 인생 최대의 난제. 왜 내 코테는 어렵고 남 코테는 쉬울까.
728x90
반응형
'생활 > 코테' 카테고리의 다른 글
이친수 (feat. 백준, 2193번) (0) | 2022.07.20 |
---|---|
오픈채팅방 (feat. 프로그래머스, 42888번) (0) | 2022.07.20 |
문자열 압축 (feat. 프로그래머스, 60057번) (0) | 2022.07.20 |
로또의 최고 순위와 최저 순위 (feat. 프로그래머스, 77484번) (0) | 2022.07.20 |
신고 결과 받기 (feat. 프로그래머스, 92334번) (0) | 2022.07.20 |
Comments