문제

image

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <string>
#include <vector>
#include <cctype>

using namespace std;

string solution(string s) {
    string answer = "";
    
    if (isalpha(s[0])) s[0] = toupper(s[0]);
    
    for (int i = 1; i < s.size(); i++){
        if (s[i-1] == ' ' && s[i] != ' ') s[i] = toupper(s[i]);
        else s[i] = tolower(s[i]);
    }
    
    answer = s;
    return answer;
}

접근 및 풀이

문자열을 다루는 문제이다. 처음에는 공백 기준으로 문자열을 토큰화하는 방법을 썼는데, 공백이 두 번 연속으로 들어갔을 경우 처리가 힘들었고, 굳이 토큰화 해서 다시 벡터에 넣어줄 이유도 없었기 때문에 string 배열에서 문자를 하나하나 확인하는 방법을 썼다.

일단 가장 첫 문자인 0번째 문자는 무조건 단어의 첫 문자이기에 알파벳일 경우 (isalpha()로 알파벳 여부 확인) 대문자로 바꾸도록 해주었다. 여기에서 대소문자는 ccytpe 헤더의 toupper()(소문자 → 대문자) 함수와 tolower()(대문자 → 소문자) 함수를 사용해 변환한다.

그리고 나서 그 다음부터 반복문을 돌면서 앞글자가 공백이고 해당 문자가 공백이 아닐 경우, 즉 해당 문자가 단어의 첫 문자일 경우에는 대문자로 바꾸고 나머지 문자들은 소문자로 바꾸어 준다.

문제 자체는 어려운 문제가 아니지만 공백이 연속해서 나올 수 있다는 조건을 생각해 주지 않으면 틀릴 수 있는 것 같다.

댓글남기기