[프로그래머스] 신규 아이디 추천
2021. 10. 6. 16:16ㆍTIL💡/Algorithms
프로그래머스: 문제
정규표현식을 쓰지 않고도 풀 수 있는 문제이지만 정규표현식으로 풀어보았다.
그동안 정규표현식을 이론적으로만 습득한 후, 검색 찬스를 이용해 때마다 주먹구구식으로 넘어갔다는 점이 아쉬웠던 차에 드디어 적용해낸 것 같아 상당히 기쁘다.
물론 최적화된 코드는 아니라서 코드가 지저분하지만, 그만큼 직관적이라는 거지.
핵심적으로 활용한 부분은 아래와 같다.
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 |