(코딩테스트)신규아이디 추천

2022. 6. 30. 02:03개발자 과정/C,C++

1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

 

그냥 여기에 나와있는 그대로 따라 만들어 주면 된다.

실력있는 분은 이 코드를 엄청 압축시켜 놨던데, 로직자체는 변함이 없다. 정말 그냥 시키는 대로 만들면 되는 문제라..

다만, 예외에 각별히 신경을 쓰는게 좋겠다. 난 메모리 예외가 나왔는데, 찾느라 시간이 좀 걸렸다...

class ChManager {
//class를 썼다. 조건에 맞춰 이리저리 밑그림을 그려보는데,
이게 함수로 나눠도 되게 지저분 할 거 같아서 스스로 정돈하며
코드를 작성할 겸, 객체지향의 꽃은 객체를 만들때다! 싶은 생각도 할겸
class를 사용했다.//

    string new_id;
public:
    ChManager(string new_id) {
        this->new_id = new_id;//생성자//
    }
    void ch1() {
        string answer = "";
        for (int i = 0; i < new_id.length(); i++) {
            answer += tolower(new_id[i]);
        }
        new_id = answer;
    }//대문자를 소문자로 바꾼다.//
    
    void ch2() {
        string answer = "";
        for (int i = 0; i < new_id.length(); i++) {
            if (new_id[i] == '-' || new_id[i] == '.' || new_id[i] == '_' || islower(new_id[i])||isdigit(new_id[i])) {
                answer += new_id[i];
            }
        }
        new_id = answer;
    }//조건에 맞는 문자로 거른다.//
    
    void ch3() {
        string answer = "";
        for (int i = 0; i < new_id.length(); i++) {
            if (new_id[i] == '.') {
                if (new_id[i+1] == new_id[i]) {
                    continue;
                }
                else answer += new_id[i];
            }
            else answer += new_id[i];
        }
        new_id = answer;
    }//중복된'.'문자를 통일시킨다.//
    
    void ch4() {
        string answer = "";
        int i = 0;
        while ((new_id[i] == '.' || new_id.back() == '.'))
        {
        //왜 while을 썼지...?내가 생각해도 이상하다..
        아무튼 실행시간도 문제없으니...//
            if (new_id[i] == '.') {
                i++;
            }
            if (new_id.back() == '.') {
                new_id.pop_back();
            }
            ch5();//문자열이 비는지 확인하는 함수다.
            '.'만 있는데 pop할 경우를 대비한다.
            그렇지 않으면 메모리 오류가 난다.//
        }
        answer = new_id.substr(i);
        new_id = answer;
        //알맞게 다시 문자열을 정리한다.//
    }
    void ch5() {
        if (new_id.empty()) {
            new_id = 'a';
        }
    }//문자열이 비었는지 확인한다.//
    
    void ch6() {
        if (new_id.length() > 15) {//문자열이 15문자를 넘으면//
            string answer = new_id.substr(0, 15);//15개 까지 자른다.//
            new_id = answer;
            if (new_id.back() == '.') {
            //15개로 잘랐을때 맨 뒤에 '.'이 있으면//
                new_id.pop_back();//pop한다.//
            }
        }
    }
    void ch7() {
        while (new_id.length() <= 2)
        {
            new_id.push_back(new_id.back());
        }//문자열이 2문자 이하면 3문자가 될 때 까지 
        맨 뒤의 문자를 복사해 붙여넣는다.//
    }
    string callid() {
        return new_id;
    }//결과 리턴//
};

괜히 객체로 만들려 했던거 같다...노가다 했다 끄아아아악