본문 바로가기
Programming Solve/프로그래머스

프로그래머스 - 신규 아이디 추천 / C++

by msm1029 2021. 3. 18.
반응형

문제 링크 : programmers.co.kr/learn/courses/30/lessons/72410

 

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

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

programmers.co.kr

 

총평 : 

아직 C++ stl을 완전 이해하지 못한 것 같다. 코딩테스트에 해당 문제가 나오고 구글링이 금지라면 꽤나 당황할 것 같다. 아래에 내가 헷갈렸던 것들을 적어보았다.


erase()는 두 가지 용법이 있다.  포인터로 사용하면 해당 위치를 삭제하고, 실제 숫자를 사용하면 해당 인덱스부터 n개를 삭제한다.
마찬가지로 end()와 begin()은 포인터이고 back()과 front()는 실제 값을 인수로 사용한다. 코드를 보면서 이해하면 빠르게 이해할 수 있을 것이다.

 

<코드>

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;

string solution(string new_id) {
    string answer = "";
    
    //1단계
    for(int i=0; i<new_id.size(); i++){
        if(isupper(new_id[i]))
            new_id[i] = tolower(new_id[i]);
    }
    
    //2단계
    for(int i=0;i<new_id.size(); i++){
        if((new_id[i] >= 'a' && new_id[i] <= 'z') || isdigit(new_id[i]) || new_id[i] == '-' ||
         new_id[i] == '.' || new_id[i] == '_'){
            answer.push_back(new_id[i]);
        }
    }
    //3단계
    for(int i=1; i<answer.size();){
        if(answer[i] == '.' && answer[i-1] == '.'){
            answer.erase(i, 1);
            continue;
        }
        else i++;
    }
    //4단계
    if(answer.front() == '.') answer.erase(0, 1);
    if(answer.back() == '.') answer.erase(answer.size() - 1, 1);
    
    //5단계
    if(answer.empty()) answer.push_back('a');
    
    //6단계
    if(answer.size() >= 16){
        while(answer.size() != 15){
            answer.erase(answer.end() - 1);
        }
    }
    
    if(answer.back() == '.') answer.erase(answer.end() - 1);
    
    
    //7단계
    if(answer.size()<=2){
        while(answer.size() != 3){
            answer.push_back(answer.back());
        }
    }
    
    return answer;
}

 

반응형