티스토리 뷰

성공 코드(내 코드)

  • 마침표가 두개 이상이면 하나로 치환하기 위해 fs 변수 사용
    • .이 나오면 fs=1로 만들고
    • 다음부터 .이 나오는 경우 fs가 1이면 연속해서 나오는 것이므로 해당 문자를 erase
    • .이 아닌 조건에 만족하는 다른 문자가 나오면 fs=0으로 만든다.
  • 나머지 단계는 흐름에 맞게 if문을 사용
#include <string>
#include <vector>

using namespace std;

string solution(string new_id) {
    string answer = "";
    int fs=0;
    
    for(int i=0; i<new_id.size(); i++){
        answer+=tolower(new_id[i]);
    }
    for(int i=0; i<answer.size(); i++){
        if(answer[i]=='.'){
            if(fs>0){
                answer.erase(i--, 1);
                continue;
            }
        }
        if((answer[i]>=97 && answer[i]<=122) || (answer[i]>=48 && answer[i]<=57) || answer[i]=='-' || answer[i]=='_'){
            fs=0;
            continue;
        } else if(answer[i]=='.'){
            fs=1;
        }else{
            answer.erase(i--, 1);
        }
    }
    if(answer[0]=='.'){
        answer.erase(0, 1);
    }
    if(answer[answer.size()-1]=='.'){
        answer.erase(answer.size()-1, 1);
    }
    if(answer.size()==0){
        answer+="a";
    }
    if(answer.size()>=16){
        answer.erase(15, answer.size()-1);
    }
    if(answer[answer.size()-1]=='.'){
        answer.erase(answer.size()-1, 1);
    }
    if(answer.size()<=2){
        char last=answer[answer.size()-1];
        while(answer.size()!=3){
            answer+=last;
        }
    }
    
    return answer;
}

 


다른 사람 풀이

  • string의 맨 앞 인자를 반환하는 front
    • str1.front();
  • string의 맨 뒤 인자를 반환하는 back
    • str1.back();
  • 문자열 내에 일치하는 문자가 있는지 검사하는 함수 strchr
    • 첫번째 매개변수: 검사할 문자열
    • 두번째 매개변수: 존재하는지 확인할 문자
    • 문자가 존재하면 해당 문자가 존재하는 곳의 포인터를 반환하고 존재하지 않으면 널 포인터를 반환한다.
    • strchr(str, 'M');
#include <bits/stdc++.h>
using namespace std;

string solution(string new_id) {
    for (char& ch : new_id) if ('A' <= ch && ch <= 'Z') ch |= 32;

    string ret;
    for (char& ch: new_id) {
        if ('a' <= ch && ch <= 'z' ||
            '0' <= ch && ch <= '9' ||
            strchr("-_.", ch)) ret += ch;
    }

    new_id = ret;
    ret.clear();
    for (char& ch: new_id) {
        if (!ret.empty() && ret.back() == '.' && ch == '.') continue;
        ret += ch;
    }

    if (ret.front() == '.') ret.erase(ret.begin());
    if (ret.back() == '.') ret.pop_back();

    if (ret.empty()) ret = "a";
    if (ret.size() >= 16) ret = ret.substr(0, 15);
    if (ret.back() == '.') ret.pop_back();
    while (ret.size() <= 2) ret += ret.back();

    return ret;
}

 

  • 함수를 호출하는 스트링의 맨뒤에 있는 문자 하나를 없애는 함수 pop_back()
    • str1.pop_back();
  • 문자열의 일부를 리턴하는 substr
    • 문자열.substr(시작 위치, 길이)
    • 첫 번째 인수에는 시작 위치를, 두 번째 인수에는 취득하고 싶은 문자수를 지정한다.
    • str1.substr(5, 1); // 5번째 인자부터, 1의 길이만큼 문자열을 반환
  • 문자열의 사이즈를 반환하는 size
    • str1.size();
#include <bits/stdc++.h>
using namespace std;

bool isok(char x) {
    if (islower(x) || isdigit(x) || x == '-' || x == '_' || x == '.') return 1;
    return 0;
}

string solution(string new_id) {
    string tmp ="";
    for (char &c : new_id) if (isupper(c)) c = tolower(c);
    for (char c : new_id) if (isok(c)) tmp += c;
    new_id = "";
    for (int i = 0; i < tmp.size(); i++) 
        if (tmp[i] != '.' || (!new_id.empty() && new_id.back() != '.')) new_id += tmp[i];
    if (new_id.back() == '.') new_id.pop_back();
    if (new_id.front() == '.') new_id = new_id.substr(1);
    if (new_id.empty()) new_id.push_back('a');
    if (new_id.size() >= 16) new_id = new_id.substr(0, 15);
    while (new_id.back() == '.') new_id.pop_back();
    while (new_id.size() <= 2) new_id += new_id.back();
    return new_id;
}