발상의 전환, tolower/toupper() 에 대한 추가 지식

Subin·2024년 12월 25일

Algorithm

목록 보기
54/69

문자열 내 단어들에서, 첫 문자는 무조건 대문자로 나머지는 소문자로 변환하는 문제가 있었다.
조건1. 단어 맨 앞엔 문자 대신 숫자도 가능, 숫자는 맨 앞에만 등장
조건2. 공백은 연속으로 등장 가능

나는 tolower()와 toupper()를 활용해서 풀었지만, 코드가 쓸데없이 길어진 느낌이 있었다.

내 풀이

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string solution(string s) {
    string answer = "";
    bool done = true; // 단어가 끝났는지
    for(auto& c: s)
    {
        if(c == ' ') // 공백이면 단어가 끝난 것
        {
            done = true;
            continue; // 아래 코드 실행 안 함
        }
        if(c >= '0' && c <= '9') // 숫자일 경우 
        {
            done = false; // 첫 단어 끝남
            continue; // 아래 코드 실행 안 함
        }
        if(done) // 첫 단어이자 숫자가 아닐 경우
        {
            c = toupper(c); // 대문자 처리
            done = false; // 첫 단어 끝남
            continue; // 아래 코드 실행 안 함
        }
        // 이외는 전부 소문자 처리
        c = tolower(c);
    }

    answer = s;
    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;
}

문자 앞에 공백이 있다면, 그 문자가 단어의 첫 문자라는 사실만 알면 되는 거였다.


여기서 몰랐던 사실은,
tolower()와 toupper()은 문자만 변환하고 숫자, 특수문자는 그대로 반환한다는 것이다.
그래서 굳이 숫자임을 확인하지 않아도 됐었던 문제다.

profile
성장하며 꿈꾸는 삶을 살아가고 있는 대학생입니다😊

0개의 댓글