JadenCase 문자열 만들기

troubleshooting·4 min read·2026-08-07
목차

한 줄 요약

공백을 따로 찾아 다음 글자를 처리하지 말고, 모든 글자가 “내가 단어의 시작인가”를 스스로 판단하게 하면 예외가 사라진다.

왜 (배경/문제 상황)

JadenCase 문자열 만들기 — 문자열의 각 단어 첫 글자는 대문자로, 나머지는 소문자로 바꾸는 문제.

원인 분석 → 해결 방법

시도 1: 인덱스 범위 밖 접근 (Undefined Behavior)

else if(s[i-1] != ' ' and i != 0){

and(&&)는 왼쪽부터 평가하는 단락평가라서, i != 0을 확인하기 전에 s[i-1]을 먼저 읽어버린다. i=0일 때 s[-1]은 범위 밖 메모리 접근이라 정의되지 않은 동작이 발생한다. 조건 순서를 바꿔서 i != 0을 먼저 확인해야 안전하다.

시도 2: 마지막 글자가 처리되지 않음

for(int i = 0; i < s.size() - 1; i++){

루프가 s.size() - 1까지만 돌아서 마지막 인덱스(s.size() - 1)는 tolower 처리 기회가 없다.

해결: 공백을 찾아 다음 글자를 건드리는 방식 대신, 각 글자가 자기 자신의 대소문자를 스스로 결정하게 바꿈

string solution(string s) {
    for (int i = 0; i < s.size(); i++) {
        if (i == 0 || s[i-1] == ' ') {
            s[i] = toupper(s[i]);  // 단어의 시작
        } else {
            s[i] = tolower(s[i]);  // 단어 중간
        }
    }
    return s;
}

i == 0 || s[i-1] == ' '는 ||(or)라서 i == 0이 참이면 s[i-1]은 평가 자체를 안 한다 (단락평가). 그래서 범위 밖 접근이 안전하게 막히고, 루프도 s.size()까지 다 돌아서 마지막 글자까지 빠짐없이 처리된다.

예제

원래 접근(공백을 찾아서 다음 글자를 대문자로 바꾸는 방식)은 “예외 처리를 얼마나 정확히 하느냐”가 관건이었는데, “각 글자가 스스로 판단”하는 방식으로 바꾸니 예외 처리 자체가 필요 없어졌다. 문제를 어느 시점 기준으로 바라보느냐(공백 기준 vs 글자 기준)에 따라 코드 복잡도가 크게 달라진 경우.

주의사항

  • &&/||는 왼쪽부터 평가하는 단락평가라는 걸 활용해서, 범위 체크(i != 0, i == 0)를 항상 배열 접근보다 먼저 오는 조건으로 배치해야 안전하다.
  • 이 문제는 해시/정렬/그리디 등 기존 분류에 속하지 않는 “문자열 순회+변형” 유형이라 별도 개념 article 없이 troubleshooting으로만 기록. 비슷한 유형이 반복되면 그때 문자열 처리 개념 article을 새로 만든다.