본문 바로가기

Algorithm/카카오기출

[프로그래머스]신규 아이디 추천

문제

 

풀이

#include <string>
#include <vector>


using namespace std;

string solution(string new_id) {
    string answer = "";
    //1단계
    for(int i=0; i<new_id.length();i++){
        new_id[i] = tolower(new_id[i]);
    }
    //2단계
    for(int i=0; i<new_id.length();i++){
        if((new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.') ||
           (new_id[i] >= 'a' && new_id[i] <= 'z') ||
           (new_id[i] >= '0' && new_id[i] <= '9')){//숫자
            answer += new_id[i];
        }        
    }
    //3단계
    for(int i=0; i< answer.length()-1; i++){
        if (answer[i] == answer[i+1] && answer[i] == '.'){
            answer.erase(i, 1);
            i--;
        }
    } 
    //4단계
    if(answer[0] == '.') answer.erase(0,1);
    if(answer[answer.length()-1] == '.') answer.erase(answer.length()-1, 1);
    //5단계
    if(answer == "") answer = "a";
    //6단계
    if(answer.length() >= 16) answer = answer.substr(0,15);
    if(answer[answer.length()-1] == '.') answer.erase(answer.length()-1, 1);
    //7단계
    if(answer.length() <= 2){
        char last = answer[answer.length()-1];
        while(answer.length() < 3){
            answer += last;
        }
    }
    
    return answer;
}

 

 

 

 


 

 

다른 사람 풀이

#include <bits/stdc++.h>
using namespace std;

string solution(string new_id) {
    for (char& ch : new_id) if ('A' <= ch && ch <= 'Z') ch |= 32;

    string ret;
    for (char& ch: new_id) {
        if ('a' <= ch && ch <= 'z' ||
            '0' <= ch && ch <= '9' ||
            strchr("-_.", ch)) ret += ch;
    }

    new_id = ret;
    ret.clear();
    for (char& ch: new_id) {
        if (!ret.empty() && ret.back() == '.' && ch == '.') continue;
        ret += ch;
    }

    if (ret.front() == '.') ret.erase(ret.begin());
    if (ret.back() == '.') ret.pop_back();

    if (ret.empty()) ret = "a";
    if (ret.size() >= 16) ret = ret.substr(0, 15);
    if (ret.back() == '.') ret.pop_back();
    while (ret.size() <= 2) ret += ret.back();

    return ret;
}

 

1. or연산을 사용해서 tolower를 쓰지 않고 소문자로 만들었다.

2. 문자 하나하나 대입해서 비교하기보단 strchr을 사용해 일치하는 문자만 ret에 삽입했다.

3. 나는 erase함수에 length를 구해서 맨 마지막 글자를 지웠는데(length를 계속 불러서 비효율적...), pop_back()을 쓰면 더 간단했다.

4. back() 함수로 문자열의 마지막 문자를 가져올 수 있다!

 

 

 

 


https://maincodes.tistory.com/68

 

[C/C++] ASCII 코드값을 이용하여 문자열 내 알파벳, 대소문자, 공백, 숫자 식별(분류)하기 + 대소문

[C/C++] ASCII 값을 이용하여 문자열 내 알파벳, 대소문자, 공백, 숫자 식별(분류)하기 + 대소문자 변환하기 안녕하세요 JollyTree입니다 (•̀ᴗ•́)و C/C++에서 char 자료형의 문자 변수는 0에서 127 사이

maincodes.tistory.com

https://jhnyang.tistory.com/116

 

[C++]string 총정리 2탄(clear, empty, 문자열 추출 substr, 반복자 begin/end, 변경 replace, 제거 erase)

[C언어, C++언어, Java언어 기초 프로그래밍 완전 정복 목차!] [C++] 저번 포스팅에서 String 사용하는 법 1탄을 살펴봤어요. 총정리가 뭔가 깔끔한거같아서 제목은 바꿨지만 저번 String 포스팅에 이어

jhnyang.tistory.com

https://blockdmask.tistory.com/338

 

[C++] string 클래스, 문자열에 대해서 (총정리)

안녕하세요 BlockDMask 입니다.오늘은 C++의 std::string 클래스(문자열)에 대해서 세세 하게 알아볼것 입니다.예전 글을 보다가 제가 작성한 이 문서를 보게 되었는데요, 너무 내용이 빈약하다고 생

blockdmask.tistory.com