문제

설명

  • 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 만드는 문제

코드

#include <string>
#include <vector>
#include <cctype>
#include <regex>

using namespace std;

// 모든 대문자를 대응되는 소문자로 치환합니다.
string first(string s) {
    for (char &c : s) {
        if (isalpha(c) && isupper(c)) {
            c = tolower(c);
        }
    }
    
    return s;
}

// 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
string second(string s) {
    regex re("[^a-z0-9\-_.]");
    return regex_replace(s, re, "");
}

// 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
string third(string s) {
    regex re("\\.{2,}");
    return regex_replace(s, re, ".");
}

// 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
string fourth(string s) {
    regex re("^\\.?(.*?)\\.?$");
    return regex_replace(s, re, "$1");
}

// 빈 문자열이라면, new_id에 "a"를 대입합니다.
string fifth(string s) {
    if (s.size() == 0) {
        s = "a";
    }
    return s;
}

// 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
string sixth(string s) {
    if (s.size() >= 16) {
        s = s.substr(0, 15);
        regex re("(.*?)\\.?$");
        s = regex_replace(s, re, "$1");
    }
    return s;
}

// 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
string seventh(string s) {
    if (s.size() <= 2) {
        auto tmp = s.substr(s.size()-1);
        while (s.size() < 3) {
            s += tmp;
        }
    }
    return s;
}

string solution(string new_id) {
    string answer = "";
    
    answer = first(new_id);
    answer = second(answer);
    answer = third(answer);
    answer = fourth(answer);
    answer = fifth(answer);
    answer = sixth(answer);
    answer = seventh(answer);
    
    return answer;
}

댓글을 남기시려면 Github 로그인을 해주세요