풀긴 풀었으나, 완벽하지 풀지 못하고 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번은 실패한다..
일단 적어놓고 나중에 또 참고해보자