본문 바로가기

코딩 테스트(Coding test)/Lv. 2

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

미숙한 블로그 주인이 코딩테스트 문제를 풀어가는 과정을 담은 글입니다. 이 풀이가 효율적인 풀이가 아닐 수 있으며, 부정확한 정보가 많이 있을 수 있습니다. 보완해야할 점이 있다면 댓글로 남겨주세요!

 

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

 

코딩테스트 연습 - JadenCase 문자열 만들기

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고

programmers.co.kr

JadenCase 문자열 만들기

문제

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

제한사항

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

 

풀이

입출력 예시

 

풀이

처음의 문자가 소문자이면 대문자로, 아니면 그대로 두자. 그 뒤부터는 공백(" ")을 찾아서 공백 바로 뒷부분이 소문자면 대문자로 바꿔주고, 아니라면 소문자로 바꿔주자.

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

using namespace std;

string solution(string s) {
    string answer = s;

    if (isalpha(answer[0]) == 2) { // 첫 문자가 소문자이면 대문자로
        answer[0] = toupper(answer[0]);
    }

    for (int i = 1; i < answer.length(); i++) {
        if (answer[i - 1] == ' ' && isalpha(answer[i]) == 2) { // 공백 다음이 소문자면 대문자로
            answer[i] = toupper(answer[i]);
        }
        else {
            answer[i] = tolower(answer[i]);
        }
    }

    return answer;
}

별다른 어려움이 없다. 라고 했다가 바로 통수 맞았다.

왜지? Visual Studio에선 테스트 케이스가 잘 작동했는데 말이다. 테스트 2를 보면 시작부터 조건문이 실행이 되질 않았다... 내가 알고 있기로는 isalpha는 알파벳이 아니면 0을, 대문자면 1을, 소문자면 2를 출력하는 걸로 알고 있었다. isalpha가 문제인 건가? 테스트 출력을 시켜보자.

아,, 역시나였다. isalpha가 대소문자 상관없이 1024라는 값을 반환하고 있었다. 검색을 해본 결과 isalpha라는 함수는 컴파일러마다 반환하는 값이 달랐다;;

 

그리고 뒤늦게 깨달은 사실이지만, 사실 isalpha가 2인지도 알 필요가 없었다. 대문자/소문자로 바뀌는건 알파벳 뿐이기 때문이다..

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

using namespace std;

string solution(string s) {
    string answer = s;

    if (isalpha(answer[0])) { // 첫문자가 알파벳이면 대문자로
        answer[0] = toupper(answer[0]);
    }

    for (int i = 1; i < answer.length(); i++) {
        if (answer[i - 1] == ' ' && isalpha(answer[i])) { // 공백 다음이 알파벳이면 대문자로
            answer[i] = toupper(answer[i]);
        }
        else { // 아니면 소문자로
            answer[i] = tolower(answer[i]);
        }
    }

    return answer;
}

결과