[C++] 이상한 문자 만들기 - split 함수 만들기, 대소문자 toupper, tolower 함수 사용

wansuper·2023년 12월 29일
0

CodingTest

목록 보기
20/34

정답코드


#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 함수를 공부해본 것에 의의를 두기 위해 아래 정리했다.

split(string input, char dlim)

  • C++에서는 istringstream이라는 문자열에서 동작하는 스트림 클래스가 있다. 이는 sstream이라는 C++ 표준 라이브러리를 추가해야한다.
  • istringstream은 istream을 상속받기 때문에 getline 함수를 사용할 수 있다.
    - getline(istream& is, string &str, char &delim);
#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
profile
🚗 Autonomous Vehicle 🖥️ Study Alone

0개의 댓글