No Rules Rules

신규 아이디 추천 (feat. 프로그래머스, 72410번) 본문

생활/코테

신규 아이디 추천 (feat. 프로그래머스, 72410번)

개발하는 완두콩 2022. 7. 20. 14:20
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
반응형
Comments