https://school.programmers.co.kr/learn/courses/30/lessons/72410
"네오"에게 주어진 첫 업무는 새로 가입하는 유저들이 카카오 아이디 규칙에 맞지 않는 아이디를 입력했을 때, 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 추천해주는 프로그램을 개발하는 것입니다.
문제 설명이 정말 잘되어있는 문제이다. 읽어보면 어찌 짜야할지 대충 감이 오는데, 중요한 건 이를 구현할 수 있는지 이다.
문제의 포인트
regex를 잘 활용할 수 있는가?
regex로 특수문자들을 치환할 수 있는가?
해결법
[] 안의 특수문자는 특수문자로서의 효력을 잃는다. regex(R"([.]{2,})")와 같이 작성해주면 온점도 잘 바꿔진다.
코드
#include <string>
#include <regex>
using namespace std;
string solution(string new_id) {
string answer = "";
answer = new_id;
for (int i = 0; i < answer.length(); i++)
{
answer[i] = tolower(answer[i]);
}
for (int i = 0; i < answer.length(); i++)
{
if (isdigit(answer[i]) == false && answer[i] != '.' && answer[i] != '_' && answer[i] != '-')
{
if (answer[i] >= 'a' && answer[i] <= 'z')
{
continue;
}
answer.erase(answer.begin() + i--);
}
}
answer = regex_replace(answer, regex(R"([.]{2,})"), ".");
for (int i = 0; i < answer.length(); i++)
{
if (i == 0 || i == answer.length() - 1)
{
if (answer[i] == '.')
{
answer.erase(answer.begin() + i);//온점이라면 온점 삭제
}
}
}
if (answer == "")
answer = "a";
if (answer.length() > 15)
{
answer.erase(15);
if (answer[answer.length() - 1] == '.')
answer.erase(answer.begin() + answer.length() - 1);
}
if (answer.length() < 3)
{
while (answer.length() < 3)
{
answer += answer[answer.length() - 1];
}
}
return answer;
}
여담
regex정규표현식에 .란 특수문자가 있다는 것을 알지 못하고 작성하여 개행 문자를 제외한 모든 문자가.으로 치환되는 끔찍한 오류를 겪었다.. [] 안의 특수문자는 특수문자로서의 효력을 잃는다는 블로그 글을 보고 수정하였다.
이제 제대로 작동하여 .가 두 번 이상 반복되면.으로 대체한다!
'코딩테스트' 카테고리의 다른 글
KOISTUDY 코이스터디 2661번 a+= C++ 풀이 (0) | 2022.12.15 |
---|---|
백준 11047번 동전0 C++ 풀이 (0) | 2022.12.13 |
백준 2178번 미로 탐색 C++ 풀이 (0) | 2022.12.09 |
프로그래머스 숫자 문자열과 영단어 C++ 풀이 (0) | 2022.12.09 |
백준 2442번 별 찍기 - 5 C++ 풀이 (0) | 2022.12.09 |
댓글