티스토리 뷰

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

 

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

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

programmers.co.kr

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;


// 8월 6일자 구현 중 ...

string solution(string new_id) {
    /* 허용하는 소문자, 숫자, 기호가 담긴 배열 생성 */
    int start_length = new_id.length();

    /* 1. 대문자 -> 소문자 */
    for(int i = 0; i < new_id.length(); i++){
        if(new_id[i] >= 65 && new_id[i] <= 90) new_id[i] += 32;
    }
    
    /* 2. 표준 문자 제외 제거 */
    for(int i = 0; i < new_id.length();){
        if(!isalpha(new_id[i]) && !isdigit(new_id[i]) && new_id[i] != '-' && new_id[i] != '_' && new_id[i] != '.'){
            new_id.erase(new_id.begin() + i);
        }
        else i++;
    }
    
    /* 3. 연속 마침표 제거 */
    for(int i = 0; i < new_id.length();){
        if(new_id[i] == '.' && new_id[i+1] == '.'){
            new_id.erase(new_id.begin() + i);
        } else i++;
    }
    /* 4. 양 끝단 마침표 제거 */
    if(new_id[0] == '.')  new_id.erase(new_id.begin());
    if(new_id[new_id.length() - 1] == '.') new_id.erase(new_id.length()-1,new_id.length());
    
    /* 5. 길이가 0이면 a 리턴 */
    if(new_id.empty()) new_id.push_back('a');
    
    /* 6. 15 이상이면 자르고 끝 부분만 "." 체크 */
    if(new_id.length() > 15) new_id.erase(15,new_id.length());
    if(new_id[new_id.length()-1] == '.') new_id.erase(new_id.length()-1,new_id.length());

    /* 7. 길이 2 이하면 3으로  */
    char last_char = new_id[new_id.length()-1];
    while(new_id.length() < 3){
        new_id += last_char;
    }

    return new_id;
}

 

string 제거함수인 erase사용이 익숙하다면 어렵지 않지만, 나는 그러지못했다...

허용되는 소문자, 대문자, 숫자, 특수기호 사전을 생성한 뒤 find 함수를 통해 체크하려했지만 아스키코드 변환도 머리아프고 라이브러리 검색 중 isalpha()와 isdigit()이라는 함수를 알게되어 과감히 사용.

 

 

삽질한 코드

    vector<char> standard = {'-', '_', '.'};
    int start_a = 97;
    int start_num = 48;
    for(int i = 0; i< 26; i++){
        standard.push_back(start_a);
        start_a++;
    }
    for(int i = 0; i < 10; i++){
        standard.push_back(start_num);
        start_num++;
    }

이제와서 체크해보니 소문자, 대문자는 잘 넣어놓고, 숫자를 그대로 0~9로 입력한 뒤 find함수를 사용했었다. 덕분에 isdit()과 isalpha()를 만났으니 다음부턴 이런 짓을 안해도 될거같다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함