본문 바로가기
coding test

[프로그래머스/level2] JadenCase 문자열 만들기

by objet 2024. 1. 22.

문제

 

 

풀이과정

문자열에 들어갈 수 있는 문자 종류는 대문자, 소문자, ③숫자, ④공백 총 4종류이다.
공백문자가 연속해서 나올 수 있다는 것을 유의하며 케이스를 분석하면, 

① 단어 첫 글자가 소문자면 대문자로 바꾸기

② 첫 글자가 아닌 대문자면 모두 소문자로 바꾸기

이외에는 숫자와 공백 포함 모두 그대로 answer에 넣어주면 된다.

 

①번, 현재 가리키고 있는 글자가 단어의 첫 글자임을 판별하려면 바로 앞 글자가 공백인지 확인하면 된다.

i - 1번째 요소가 공백인지를 확인하면 되는데, i = 0일 때 에러가 나기 때문에 s[0]은 따로 판별해주었다.

②번은 이전 요소가 공백이 아님을 확인하고, 현재 요소가 대문자인지를 확인하면 소문자로 바꿔주면 된다.

 

공백과 대문자/소문자 확인은 <cctype> 라이브러리의 isspace(), isupper(), islower()로 하면 편하다.이외에도 숫자를 확인할 수 있는 isdigit(), 출력 가능한 문자를 확인할 수 있는 isprint() 등 다양한 함수가 포함되어 있다.

추가로, 대문자->소문자로 변환할 수 있는 tolower()와 소문자->대문자로 변환할 수 있는 toupper() 함수도 있다.

필자는 ASCII 코드와 cctype을 하나씩 사용하여 구현하였다.

소문자 a의 10진수 아스키코드는 97, 대문자 A의 10진수 아스키코드는 65이므로 숫자 32를 빼거나 더하면 된다.

 

 

풀이 코드

#include <string>
#include <vector>
#include <cctype>

using namespace std;

string solution(string s) {
    string answer = "";
    if (islower(s[0])) answer.push_back(s[0] - 32);
    else answer.push_back(s[0]);
    
    for (int i = 1; i < s.size(); i++) {
        if (isspace(s[i - 1]) && islower(s[i])) answer.push_back(s[i] - 32);
        else if (!isspace(s[i - 1]) && isupper(s[i])) answer.push_back(s[i] + 32);
        else answer.push_back(s[i]);
    }
    
    return answer;
}