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

2021. 10. 6. 16:16TIL💡/Algorithms

프로그래머스: 문제

 

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

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

programmers.co.kr

정규표현식을 쓰지 않고도 풀 수 있는 문제이지만 정규표현식으로 풀어보았다.

그동안 정규표현식을 이론적으로만 습득한 후, 검색 찬스를 이용해 때마다 주먹구구식으로 넘어갔다는 점이 아쉬웠던 차에 드디어 적용해낸 것 같아 상당히 기쁘다.

물론 최적화된 코드는 아니라서 코드가 지저분하지만, 그만큼 직관적이라는 거지.

 

핵심적으로 활용한 부분은 아래와 같다.

1. <algorithm> 헤더 내의 transform 메소드를 활용해 대소문자 일괄적 변경

trarnsform(begin, end, begin, ::tolower/ ::toupper)

2. 특정 특수문자 제외하고 제거하는 정규표현식

regex("[^a-z0-9\_\.-]") / regex("[\.]{2,}")

괄호 안에 ^이 들어가면 not처리와 동일하다. 그리고 이스케이프 문자를 활용함으로써 해당 letter가 패턴이 아니라 그 문자 그 자체를 의미함을 명시한다.  만약 패턴 뒤에 {a,b}를 통해 반복 횟수를 지정할 수 있다. 여기서는 b를 공백으로 남겨둠으로써 상한선을 두지 않고 2이상을 의미하도록 하였다.

정규표현식만 제대로 활용하고 문자열 배열 범위만 신경 쓴다면 단번에 테스트케이스를 통과할 수 있다.

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <regex>
using namespace std;

string solution(string new_id) {
    string answer = "";
    // 1단계
    std::transform(new_id.begin(), new_id.end(), new_id.begin(), ::tolower);
    // 2단계
    string id2 = regex_replace(new_id, regex("[^a-z0-9\_\.-]"), ""); 
    // 3단계
    string id3 = regex_replace(id2, regex("[\.]{2,}"), ".");
    // 4단계
    string id4 = id3;
    if(id4.length() > 0 && id4[0] == '.'){
        id4 = id4.substr(1);
    }
    if(id4.length() > 0 && id4[id4.length() - 1] == '.'){
        id4 = id4.substr(0, id4.length() - 1);
    }
    // 5단계
    string id5;
    if(id4.length() == 0){
        id5 = "a"; 
    }
    else {
        id5 = id4;
    }
    // 6단계
    string id6;
    if(id5.length() >= 16){
        id6 = id5.substr(0, 15);
    }
    else {
        id6 = id5;
    }
    if(id6[id6.length() - 1] == '.'){
        id6 = id6.substr(0, id6.length() - 1);
    }
    // 7단계
    string id7 = id6;
    if(id7.length() <= 2){
        while(id7.length() < 3){
            id7 += id7[id7.length() - 1];
        }
    }
    answer = id7;
    return answer;
}

 

'TIL💡 > Algorithms' 카테고리의 다른 글

[백준] 2531 회전초밥  (0) 2021.10.08
[백준] 2096 내려가기  (0) 2021.10.07
[프로그래머스] 퍼즐 조각 채우기  (0) 2021.10.07
[프로그래머스] 부족한 금액 계산기  (0) 2021.10.07
[프로그래머스] 실패율  (0) 2021.10.07