[프로그래머스] LEVEL1 : 신규 아이디 추천 C++

    반응형

    #INFO

    문제 : 신규 아이디 추천

    난이도 : LEVEL1

    출처 : 2021 KAKAO BLIND RECRUITMENT

    코딩테스트 연습 - 신규 아이디 추천 | 프로그래머스 (programmers.co.kr)


    #SOLVE

    해당 언어의 문자열 관련 함수에 대해 잘 알고 있으면 쉽게 풀이할 수 있는 문제였다.

    문제에서 제시한 조건대로 차근차근 따라가면 어렵지 않게 풀어나갈 수 있지만,,,,

    2단계와 3단계 처리에서 조금 애를 먹었다.

        // 2 단계 : new_id에서 "알파벳 소문자", "숫자", "빼기(-)", "밑줄(_)", "마침표(.)"
        // 를 제외한 모든 문자를 제거 _ islower, isdigit
        for(int i = 0; i < new_id.length(); ) {
            if (islower(new_id[i]) || isdigit(new_id[i])
                  || new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.'){
                i++;
                continue;
            }
            
            new_id.erase(new_id.begin() + i);
        }
        
        // 3 단계 : 마침표(.)가 2번 이상 연속되면 하나의 마침표(.)로 치환
        for(int i = 1; i < new_id.length(); ){
            if (new_id[i] == '.' && new_id[i - 1] == '.'){
                new_id.erase(new_id.begin() + i);
                continue;
            }
            else i++;
        }

    string 라이브러리의 erase 함수는 문자열의 특정 위치의 문자를 제거하고 자동으로 뒤에 있는 문자열을 앞으로 땡겨주기 때문에, 인덱스 i의 값을 증가시켜줄 필요가 없다.

    이 부분만 조심하면 나머지는 크게 어렵지 않았던 것 같다. 


    #CODE

    #include <string>
    #include <vector>
    #include <cctype>
    using namespace std;
    
    string solution(string new_id) {
    
        // 1 단계 : new_id의 모든 대문자를 소문자로 치환 _ isupper, tolower
        for(int i = 0; i < new_id.length(); i++)
            if (isupper(new_id[i])) 
                new_id[i] = tolower(new_id[i]);
        
        // 2 단계 : new_id에서 "알파벳 소문자", "숫자", "빼기(-)", "밑줄(_)", "마침표(.)"
        // 를 제외한 모든 문자를 제거 _ islower, isdigit
        for(int i = 0; i < new_id.length(); ) {
            if (islower(new_id[i]) || isdigit(new_id[i])
                  || new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.'){
                i++;
                continue;
            }
            
            new_id.erase(new_id.begin() + i);
        }
        
        // 3 단계 : 마침표(.)가 2번 이상 연속되면 하나의 마침표(.)로 치환
        for(int i = 1; i < new_id.length(); ){
            if (new_id[i] == '.' && new_id[i - 1] == '.'){
                new_id.erase(new_id.begin() + i);
                continue;
            }
            else i++;
        }
        
        // 4 단계 : 마침표(.)가 처음이나 끝에 위치하면 제거
        if (new_id.front() == '.') new_id.erase(new_id.begin());
        if (new_id.back() == '.') new_id.erase(new_id.end() - 1);
        
        // 5 단계 : new_id가 빈 문자열이면, "a"를 대입
        if (new_id.length() == 0) 
            new_id = "a";
        
        // 6 단계 : new_id의 길이가 16 이상이면, 첫 15개 문자를 제외한 나머지 문자 제거
        if (new_id.length() >= 16){
            while(new_id.length() != 15){
                new_id.erase(new_id.begin() + 15);
            }
        }
        if (new_id.back() == '.') new_id.erase(new_id.end() - 1);
        
        // 7 단계 : new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id 길이가 3이 될 때 까지 반복
        if (new_id.length() <= 2){
            while(new_id.length() != 3){
                new_id += new_id.back();
            }
        }
        
        return new_id;
    }
    반응형

    댓글

    Designed by JB FACTORY