코딩테스트

프로그래머스 신규 아이디 추천 C++ 풀이

5_솔방울 2022. 12. 9.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

"네오"에게 주어진 첫 업무는 새로 가입하는 유저들이 카카오 아이디 규칙에 맞지 않는 아이디를 입력했을 때, 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 추천해주는 프로그램을 개발하는 것입니다.

 

문제 설명이 정말 잘되어있는 문제이다. 읽어보면 어찌 짜야할지 대충 감이 오는데, 중요한 건 이를 구현할 수 있는지 이다.

 

문제의 포인트

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정규표현식에 .란 특수문자가 있다는 것을 알지 못하고 작성하여 개행 문자를 제외한 모든 문자가.으로 치환되는 끔찍한 오류를 겪었다.. [] 안의 특수문자는 특수문자로서의 효력을 잃는다는 블로그 글을 보고 수정하였다.

이제 제대로 작동하여 .가 두 번 이상 반복되면.으로 대체한다!

 

댓글