문자열 내 단어들에서, 첫 문자는 무조건 대문자로 나머지는 소문자로 변환하는 문제가 있었다.
조건1. 단어 맨 앞엔 문자 대신 숫자도 가능, 숫자는 맨 앞에만 등장
조건2. 공백은 연속으로 등장 가능
나는 tolower()와 toupper()를 활용해서 풀었지만, 코드가 쓸데없이 길어진 느낌이 있었다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string s) {
string answer = "";
bool done = true; // 단어가 끝났는지
for(auto& c: s)
{
if(c == ' ') // 공백이면 단어가 끝난 것
{
done = true;
continue; // 아래 코드 실행 안 함
}
if(c >= '0' && c <= '9') // 숫자일 경우
{
done = false; // 첫 단어 끝남
continue; // 아래 코드 실행 안 함
}
if(done) // 첫 단어이자 숫자가 아닐 경우
{
c = toupper(c); // 대문자 처리
done = false; // 첫 단어 끝남
continue; // 아래 코드 실행 안 함
}
// 이외는 전부 소문자 처리
c = tolower(c);
}
answer = s;
return answer;
}
그래서 다른 사람 풀이를 확인해보니,
#include <string>
#include <vector>
using namespace std;
string solution(string s) {
string answer = "";
answer += toupper(s[0]);
for (int i = 1; i < s.size(); i++)
s[i - 1] == ' ' ? answer += toupper(s[i]) : answer += tolower(s[i]);
return answer;
}
문자 앞에 공백이 있다면, 그 문자가 단어의 첫 문자라는 사실만 알면 되는 거였다.
여기서 몰랐던 사실은,
tolower()와 toupper()은 문자만 변환하고 숫자, 특수문자는 그대로 반환한다는 것이다.
그래서 굳이 숫자임을 확인하지 않아도 됐었던 문제다.