코딩 기록 저장소

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

프로그래머스/Lv.2

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

KimNang 2023. 1. 19. 10:36

문제 정보

제목 : JadenCase 문자열 만들기

난이도 : Lv.2

사용 언어 : C++

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12951

 

문제 설명

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.

 

제한 사항

  • s는 길이 1 이상 200 이하인 문자열입니다.
  • s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
    • 숫자는 단어의 첫 문자로만 나옵니다.
    • 숫자로만 이루어진 단어는 없습니다.
    • 공백문자가 연속해서 나올 수 있습니다.

입출력 예

s return
"3people unFollowed me" "3people Unfollowed Me"
"for the last week" "For The Last Week"

입출력 예 설명

 


나의 풀이

 

공백문자가 연속해서 나올 수 있다는 조건을 보고 index 변수를 설정해서 공백문자의 인덱스값을 저장하기 위해

int index; 변수를 생성했습니다.

s문자열의 길이만큼 반복하는 for문을 생성합니다. 만약 s[i]가 공백(' ')이라면 index변수에 i를 저장합니다. 그리고 공백을 answer에 저장합니다. 공백이 아니라면 여러 조건문을 통해 판별합니다. 만약 문자열의 처음 오는 문자(i==0)가 소문자이거나 공백 다음으로 오는 문자(i == index+1)가 소문자라면 toupper() 함수를 이용해서 대문자로 바꿔줍니다. 이어지는 문자인데 대문자라면(i != index+1) tolower()함수를 이용하여 소문자로 바꿔줍니다.

 

하지만 문자열의 첫번째 문자가 대문자일땐 이 조건을 만족해버려서 소문자로 바꿔버리는 문제가 발생했습니다.

else if( i != index+1 && isupper(s[i]))
    s[i] = tolower(s[i]);

이 문제를 해결하기 위해 고민하던 중 index 변수를 선언 및 초기화할때 초기값으로 -1을 저장하면, i가 0일때 index+1이 0이 되어 조건을 만족하지 않는다는 것을 알게되었습니다. index 변수의 초기값을 바꾸자 올바르게 실행되어 문제를 해결할 수 있었습니다.

 

코드

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

using namespace std;

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