[C++] JadenCase 문자열 만들기 - split(), toupper/tolower(), insert + 초간단 풀이

wansuper·2023년 12월 31일
0

CodingTest

목록 보기
22/34

나의 풀이

#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;
}

분석:

  • 총 주석 포함 64줄이 나왔다. 뿌듯한 마음을 가득 안고 다른 사람들의 풀이를 봤는데 놀라움을 금치 못했다. (초간단풀이...에서 소개)
  • 전체적으로 설명하자면 다음과 같다.
  1. 얼마 전부터 연습 중인 split()의 구현으로 공백을 분리해서 result에 저장한다.
  2. answer_unit이라는 문자열로 접근해 첫 문자를 대문자(toupper)로, 나머지 문자를 소문자(tolower)로 변환한다. 이를 answer에 차곡차곡 담는다.
  3. 공백의 위치만을 담고 있는 int형 벡터 space_index의 원소에 해당하는 곳에 공백을 answer에 추가하여 완성한다.

나에게 부여할 과제 및 상기할 포인트:

  1. split 함수 손코딩 연습 (이해는 했으나 암기가 불완전함)
  2. 대소문자 변환은 toupper, tolower() 반드시 상기하기
  3. 중간에 문자 삽입은 string1.insert(추가할 위치 인덱스, "추가할 문자")
  4. 더 쉽게 쉽게 가는 길을 생각해보자.

다른 사람들의 풀이

#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]의 대문자 변환.
    두번째 시점은, 공백 다음으로 오는 문자의 대소문자 변환.

  • 이렇게만 해도 코드가 상당히 짧아질 수 있다.

profile
🚗 Autonomous Vehicle 🖥️ Study Alone

0개의 댓글