#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
// split 함수 구현
vector<string> split(string input, char dlim) {
stringstream ss;
string stringBuffer;
ss.str(input);
vector<string> result;
while(getline(ss, stringBuffer, dlim)) {
result.push_back(stringBuffer);
}
return result;
}
string solution(string s) {
string answer = "";
vector<int> space_index;
// 공백 문자의 위치 저장 -> space_index vector
for (int i = 0; i < s.size(); i++) {
if (s[i] == ' ') {
space_index.push_back(i);
}
}
// 공백 문자 위치 출력 -> For debugging
for (int i = 0; i < space_index.size(); i++) {
cout << space_index[i] << " ";
}
// result vector에 공백 문자로 split된 문자열 삽입
vector<string> result = split(s, ' ');
// 공백을 제외한 문자열의 첫 문자만 대문자로, 나머지는 소문자로 변환
for (int i = 0; i < result.size(); i++) {
string answer_unit = result[i];
answer_unit[0] = toupper(answer_unit[0]);
for (int j = 1; j <= answer_unit.size(); j++) {
answer_unit[j] = tolower(answer_unit[j]);
}
// 변환한 answer_unit을 answer에 반복해서 삽입
answer += answer_unit;
}
cout << "\n";
cout << "공백 없는 answer: " << answer << "\n";
// 공백 문자의 위치에 공백을 삽입 to answer 문자열
for (int i = 0; i < space_index.size(); i++) {
answer.insert(space_index[i], " ");
}
cout << "공백 있는 answer: " << answer << "\n";
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;
}
s[0]은 무조건 toupper로 함으로써 첫번째 문자는 대문자로 오도록 표현했다. 아스키 코드로 접근하여 32를 더했다면(a: 97, A: 65), 첫 글자가 숫자나 공백일 경우 제대로 동작하지 않을 것이다. 따라서 이번 문제에서는 toupper로 표현하는 것이 바람직했다.
반복문을 보자. 인덱스 i는 1부터 시작한다. 공백 다음에 오는 문자는 무조건 toupper로 대문자 변환을, 그렇지 않으면 모두 tolower로 소문자 변환을 수행한다.
즉, 이 코드를 만든 사람은 대소문자 변환의 시점을 단 두 가지로 봤다.
첫번째 시점은, 가장 처음 오는 s[0]의 대문자 변환.
두번째 시점은, 공백 다음으로 오는 문자의 대소문자 변환.
이렇게만 해도 코드가 상당히 짧아질 수 있다.