공부/알고리즘

2021 카카오 코딩테스트 신규 아이디 추천 c++ solution

토고미 2021. 9. 9. 00:53
#include <string>
#include <vector>
#include <iostream>

using namespace std;

string solution(string new_id) {
    string answer = "";
    
    // 1. 소문자로
    for(auto n : new_id)
        answer += tolower(n);
    
    // 2. 잘못된 문자 제거
    int size = answer.size();
    for(int i=0; i<size; i++){
        char a = answer[i];
        if( (a < 'a' || a > 'z') && (a < '0' || a > '9') &&
           a != '-' && a != '_' && a != '.'){
            answer.erase(i, 1);
            i--; size--;
        }
    }
    
    // 3. 연속된 '.' 치환
    size = answer.size();
    bool flag = false;
    for(int i=0; i<size; i++){
        if(answer[i] != '.'){
            flag = false;
        }else{
            if(flag){
                answer.erase(i, 1);
                i--; size--;
            }else{
                flag = true;
            }
        }
    }
    
    // 4. 처음이나 끝에 있는 '.' 제거
    if(answer[0] == '.')
        answer.erase(0,1);
    if(answer[answer.size()-1] == '.')
        answer.erase(answer.size()-1, 1);
    
    // 5. 빈 문자열 이라면 "a" 대입
    if(answer == "") answer = "a";
    
    // 6. 16자 이상이면, 15자 제외 제거
    if(answer.size() >= 16){
        answer.erase(15);
        if(answer[answer.size()-1] == '.')
            answer.erase(answer.size()-1, 1);
    }
    
    // 7. 2자 이하라면, 3자 이상 될 때까지 마지막 문자 반복
    if(answer.size() <= 2){
        char c = answer[answer.size()-1];
        while(answer.size() < 3){
            answer += c;
        }
    }
    
    return answer;
}

 

문제에서 예외상황까지 친절하게 알려준다.

그대로 코딩하면 쉽게 된다.

 

주의할 점은 string의 erase()함수를 실행하고나면,

뒤의 인덱스들이 1씩 줄고 마찬가지로 전체 길이도 1 줄어들기 때문에

for문 안에서 erase()함수를 실행했다면 이를 고려해서 i--; size--;를 해주어야 한다.