||문제 이해

제시된 7단계의 문자열 규칙에 따라 입력받은 문자열을 변경


||해결 계획

단순 문자열 다루기 구현이라 어떠한 함수를 사용할지 고민을 했다.

 

좀 생각했던건 

3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다

이 연속된 마침표를 하나만 남기고 어떻게 제거할까 생각하다가

중복? unique? 이렇게 생각이 나서 unique를 해보면 어떨까 생각했고

정렬을 하지 않은 원상태 그대로의 연속된 중복제거이기에 unique가 정말 잘 어울린다고 결론을 내렸다.

 

나머지는 erase, front, back, begin, end, size 를 통해 쉽게 구현이 가능하다.


||계획 검증

모두 단순 string class의 함수를 사용하는것이라 시간만 검증해보면 됐다.

 

입력된 문자열의 최대 길이는 1000이다.

사용한 string class의 함수를 보면 최대 O(n)으로 짐작할 수 있으므로

시간은 충분하다고 생각하고 구현했다.


||오답 원인

개~~~~~멍청하게 이거 하나때문에 30분을 날려먹었다.

다음엔 이런 실수는 하지 말자ㅠㅠ


||구현

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

bool myUnique(const int & a, const int & b)
{
	if (a == '.') return a == b;
	return false;
}

string solution(string new_id) {
	string answer = "";

	for (auto & d : new_id)
	{
		if ('A' <= d && d <= 'Z')
			answer += tolower(d);
		else if (d == '-' || d == '_' || d == '.' || ('0' <= d && d <= '9') || ('a' <= d && d <= 'z'))
			answer += d;
	}

	answer.erase(unique(answer.begin(), answer.end(), myUnique), answer.end());

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

	if (answer.size() == 0) answer = "a";

	if (16 <= answer.size()) answer.resize(15);
	if (answer.back() == '.') answer.erase(answer.end() - 1);

	while (answer.size() <= 2) answer += answer.back();

	return answer;
}

||되돌아보기

단순 string class의 함수를 다룰줄 알아? 라는 문제였던것같다.

1단계지만 40분이나 걸려서 더 열심히 공부해야겠다는 생각이 든다😪


||개선 코드

    for(auto & d : new_id)
    {
        if('A' <= d && d <= 'Z')
            answer += tolower(d);
           
        //내 코드/////////////////////////////////////////////////////////////////////
        else if(d == '-'|| d == '_' || d == '.' || ('0' <= d && d <= '9') || ('a' <= d && d <= 'z'))
            answer += d;
        //다른 분의 개선코드//////////////////////////////////////////////////////////
        else if(strchr("-_.",d) ||('0' <= d && d <= '9') || ('a' <= d && d <= 'z'))
            answer += d;
    }

저 한부분을 좀 편하게 사용할 수 있는 방법이 있었는데

strchr이란 함수를 사용하는 것!

문자열안에 문자가 있으면 문자의 포인터를, 없으면 null을 반환한다.

 

훨씬 깔끔하고 보기 좋다ㅎㅎ

+ Recent posts