Algorithm/Programmers

[Programmers - c++] 신규 아이디 추천

tjddneva 2022. 2. 13. 21:33

https://programmers.co.kr/learn/courses/30/lessons/72410

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

 

그냥 시키는 대로 하면 되는 문제이다. 다만 문자열 처리하는 것을 c++ 로 하기는 참 힘들다. 하루 빨리 java 로 갈아타야하는데 c++에 너무 익숙해서 처음부터 java 로 하기는 쉽지 않다. 언제쯤 갈아타지

 

1단계

    for(int i=0; i<new_id.length(); i++){
        if(new_id[i]>='A' && new_id[i] <= 'Z'){
            new_id[i] = tolower(new_id[i]);
        }
    }

tolower 함수를 이용해서 만약 알파벳 대문자이면 소문자로 바꾸어준다.

 

2단계

    for(int i=0; i<new_id.length(); i++){
        if(new_id[i]=='-' || new_id[i]=='_' || new_id[i]=='.' || (new_id[i]>='0' && new_id[i] <= '9') || (new_id[i] >='a' && new_id[i] <= 'z')){
        }
        else{
            new_id.erase(new_id.begin()+i,new_id.begin()+i+1);
            i--;
        }
    }

알파벳, 소문자, 숫자, 빼기, 마침표가 아니면 erase 함수로 그 문자를 지워준다. 단 erase 함수로 문자열 일부를 지우게 되면 문자열 길이가 바뀐다. 그래서 반드시 i-- 를 해주어야 한다.

 

3단계

 while(1){
        auto c = new_id.find(".."); 
        if(c==string::npos) break;
        new_id.replace(c,2,".");
    }

.... 들을 . 으로 바꾸는 단계이다. ".." 을 못 찾을 때까지 ".." 을 "." 으로 바꾸는 것을 반복하면 . 이 3개 이상 있어도 상관없어진다.

 

4단계

    if(new_id[0]=='.') new_id.erase(new_id.begin(),new_id.begin()+1);
    if(new_id[new_id.length()-1]=='.') new_id.erase(new_id.end()-1,new_id.end());

처음과 끝에 있는 . 을 지운다. 꼭 마지막 문자를 가리킬때 new_id.length()-1 이런 식으로 해야하는 지 짜증난다. 더 편한 방법이 있을텐데 뭔지 모르겠다.

 

5단계

    if(new_id.length()==0){
        new_id += "a";
    }

빈 문자열이 되어버리면 a 를 추가한다.

 

6단계

    if(new_id.length() >= 16){
        new_id = new_id.substr(0,15);
        if(new_id[new_id.length()-1]=='.'){
            new_id.erase(new_id.end()-1,new_id.end());
        }
    }

문자열 길이가 16이상이라면 앞에 15개 문자만 사용한다. 그리고 마지막 문자가 . 이라면 그것도 없애준다.

 

7단계

    if(new_id.length() <= 2){
        while(new_id.length()<3){
            new_id += new_id[new_id.length()-1];
        }
    }

문자열 길이가 2 이하이면 문자열의 길이가 3 이 되게 마지막 문자를 반복해서 더해준다.

 

빨리 자바나 파이썬으로 바꿔야 한다...

 

아래는 전체 코드이다.

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <string>
#include <cmath>
#include <vector>
#include <math.h>
#include <algorithm>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <tuple>
#include <utility>
#include <typeinfo>
#include <iomanip>
#include <set>
#include <map>
#include <cctype>

using namespace std;

string solution(string new_id) {
    vector<char> v;
    
    for(int i=0; i<new_id.length(); i++){
        if(new_id[i]>='A' && new_id[i] <= 'Z'){
            new_id[i] = tolower(new_id[i]);
        }
    }
    
    for(int i=0; i<new_id.length(); i++){
        if(new_id[i]=='-' || new_id[i]=='_' || new_id[i]=='.' || (new_id[i]>='0' && new_id[i] <= '9') || (new_id[i] >='a' && new_id[i] <= 'z')){
        }
        else{
            new_id.erase(new_id.begin()+i,new_id.begin()+i+1);
            i--;
        }
    }
    
    while(1){
        auto c = new_id.find(".."); 
        if(c==string::npos) break;
        new_id.replace(c,2,".");
    }
    
    if(new_id[0]=='.') new_id.erase(new_id.begin(),new_id.begin()+1);
    if(new_id[new_id.length()-1]=='.') new_id.erase(new_id.end()-1,new_id.end());
    
    if(new_id.length()==0){
        new_id += "a";
    }
    
    if(new_id.length() >= 16){
        new_id = new_id.substr(0,15);
        if(new_id[new_id.length()-1]=='.'){
            new_id.erase(new_id.end()-1,new_id.end());
        }
    }
    
    if(new_id.length() <= 2){
        while(new_id.length()<3){
            new_id += new_id[new_id.length()-1];
        }
    }
    
    return new_id;
}