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

임성준·2022년 8월 10일
0

풀긴 풀었으나, 완벽하지 풀지 못하고 17,18,19,24번 테스트에서 실패를 하게 되어 다른사람 풀이를 참고하며 어디서 오류가 있었나 확인하기 위해 작성합니다.

문제에 나온 단계별로 코드를 작성하였습니다.

1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다. 

내가 적은 코드(private) : 
void First(string& str)
{
	for (int i = 0; i < str.size(); i++)
	{
		if (65 <= str[i] && str[i] <= 90)
		{
			str[i] += 32;
		}
	}
};

고수가 적은 코드(public) 참고 : 
void First(string& str)
{
	for(char& ch : str)
    {
    	if('A' <=ch && ch <='Z') ch +=32;
    }
}

: 나는 인덱스를 통해 각각의 문자에 접근하였지만, 고수는 향상된 for문을 통하여 접근하였
다. 그리고 아스키코드 대신 'O' 를 통하여 적으면 가독성이 더 좋아진다. 

고수의 코드로 변경해봤지만, 아직 실패...

2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)을 제외한 문자를 
제거합니다.

내가 적은 코드(private) :
bool Ascii(const char char1)
{
	if (47 < char1 && char1 < 58) return true;
	else if (char1 == 46) return true;
	else if (96 < char1 && 123 > char1) return true;
	else if (char1 == 45) return true;
	else if (char1 == 95) return true;
	return false;
}

void Second(string str1, string& str2)
{
	for (int i = 0; i < str1.size(); i++)
	{
		if (Ascii(str1[i]))
		{
			str2 += str1[i];
		}
	}
}

고수가 적은 코드(public) 참고 :
void Second(string& str1, string& str2)
{
	for(char& ch : str1) 
    {
		if('a' <= ch && ch <= 'z' || '0' <= ch && ch <= '9' ||
     		strchr("-_.",ch)) str2 +=  ch;
	}
}
: 길이 차이가 후덜덜하다. Ascii() 함수를 통하여 제외한 문자가 아니면 false 값을 리턴
받아 새로운 string인 str2에 삽입하지 않는 것으로 했지만, 고수는 if문 안에 다 넣었다.
여기서 strchr이란, 문자열 내에 원하는 문자가 있는 검사하는 함수라고 한다. 

char* strchr(const char *s, int c);은 s를 검사하면서 c가 있는지 확인하고 있다면 
해당 포인터를 리턴해주고, 없다면 NULL을 리턴해준다.

결과는 런타임에러..(?) 비쥬얼 스튜디오에서는 잘 돌아가는데.. 뭐지..? 첩첩산중.. 일단 PASS

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

내가 적은 코드(private) :
void Third(string& str1, string& str2)
{
	for (char c : str1)
	{
		if (!(!str2.empty() && c == 46 && str2.back() == 46))
			str2 += c;
	}
}

고수가 적은 코드(public) 참고 :
void Third(string& str1, string& str2)
{
	str2.clear();
    for(char&c :str1)
    {
    	if(!str2.empty() && str2.back() =='.' && c =='.') continue;
        str2 += c;
    }
}

: 고수의 코드를 참고해 적어서 비슷하다. 

3단계 실패

다른건 비슷하고 직접 변경해보았는데도 17,18,19,24번은 실패한다..
일단 적어놓고 나중에 또 참고해보자

profile
일단 적어봅니다.

0개의 댓글