#include <string>
#include <vector>
using namespace std;
string solution(string s) {
string answer = "";
// 공백이 오고 나서 새로운 단어가 올때마다 새로운 인덱스 부여 필요
int nIndex = 1;
for (int i = 0; i < s.size(); i++, nIndex++)
{
// 공백이 발생할 때마다 새로운 인덱스 nIndex는 0으로 초기화
if (s[i] == ' ')
{
nIndex = 0;
// 공백이 발생할 때마다 answer 문자열에 그대로 추가해야함
answer += " ";
}
else
// nIndex가 홀수이면 tolower로 소문자 변환, 짝수이면 toupper로 대문자 변환
nIndex & 1 ? answer += toupper(s[i]) : answer += tolower(s[i]);
}
return answer;
}
#include <string>
#include <vector>
#include <iostream>
#include <sstream>
using namespace std;
// 공백에 따라 단어를 분리하기 위해 split 함수 직접 작성 with 구글
vector<string> split(string str, char delimiter) {
istringstream iss(str);
string buffer;
vector<string> result;
while (getline(iss, buffer, delimiter)) {
for (int i = 0; i < buffer.size(); i++) {
if (i % 2 == 0) {
buffer[i] = toupper(buffer[i]);
} else {
buffer[i] = tolower(buffer[i]);
}
}
result.push_back(buffer);
}
return result;
}
string solution(string s) {
string answer = "";
// split 함수 사용시 두번째 매개변수가 char이므로 작은 따옴표 쓰기
vector<string> result = split(s, ' ');
for (int i = 0; i < result.size(); i++) {
answer += result.at(i);
if (i < result.size() - 1) {
answer += " "; // Add space between words
}
}
cout << answer << endl;
return answer;
}
위의 코드를 사용하면 연속된 공백 문자를 전혀 대응하지 못해서 사실상 못 쓰는 풀이이다. 물론 조금 수정해보면 답을 도출할 수 있겠지만,
정답 풀이처럼 공백이 올때마다 새로운 인덱스를 반복적으로 초기화하여 toupper, tolower 함수를 사용해 대소문자 변환을 수행하는 것이 주요했던 것으로 보인다.
C++은 java와 달리 split 함수가 없어서 직접 작성해야 하는 것으로 알고 있다. 그래서 이 기회에 split 함수를 공부해본 것에 의의를 두기 위해 아래 정리했다.
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
using namespace std;
vector<string> split(string input, char dlim) {
stringstream ss; // stringstream 객체인 ss 선언
string stringBuffer; // stringstream에서 문자열을 자를 때마다 임시로 저장하는 변수
ss.str(input); // ss에 문자열 삽입
vector<string> result;
// ss에서 dlim 직전까지의 문자열을 잘라서 stringBuffer에 저장. ss가 빌 때까지 실행
while (getline(ss, stringBuffer, dlim)) {
result.push_back(stringBuffer);
}
return result;
}
int main() {
string str = { "AAA BBB BBB BBB CCC" };
vector<string> result = split(str, ' '); // dlim은 char니까 작은 따옴표
for (int i = 0; i < result.size(); i++) {
cout << result[i] << endl;
}
}
출력:
AAA
BBB
BBB
BBB
CCC