본문 바로가기
알고리즘 문제/프로그래머스

[프로그래머스] JadenCase 문자열 만들기 (Java)

by Lpromotion 2025. 8. 11.

1 . 문제 설명

JadenCase: 모든 단어의 첫 문자가 대문자이고, 그 외의 알베벳은 소문자인 문자열.

단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자.

문자열 s를 JadenCase로 바꾼 문자열을 리턴하는 함수를 구한다.

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

 

2. 접근 방식

  • for문으로 s를 한 문자씩 char로 변환한다.
    • 현재 문자가 공백이면
      • boolean prevBlank를 true로 설정한다.
    • 현재 문자가 prevBlank가 true일 때
      • 대문자로 변환한다.
      • prevBlank를 false로 설정한다.
    • 현재 문자가 prevBlank가 false일 때
      • 소문자로 변환한다.
    • 위 조건 모두 정답 문자열에 추가한다.

 

3. 최종 코드

import java.io.*;

public class Solution {
     public String solution(String s) {
         StringBuilder answer = new StringBuilder();
         boolean prevBlank = true; // 이전 문자가 공백이었는지

         for (int i = 0; i < s.length(); i++) {
             char c = s.charAt(i);

             if (c == ' ') {
                 // 공백일 경우 다음 문자를 단어의 시작으로 처리
                 prevBlank = true;
                 answer.append(c);
             } else {
                 if (prevBlank) {
                     // 단어의 첫 글자: 알파벳이면 대문자로, 숫자는 그대로
                     if (c >= 'a' && c <= 'z') {
                         c = (char) (c - 32);
                     }
                     prevBlank = false; // 다음은 단어의 시작이 아님
                 } else {
                     // 담어의 나머지 글자: 알파벳이면 소문자로, 숫자는 그대로
                     if (c >= 'A' && c <= 'Z') {
                         c = (char) (c + 32);
                     }
                 }
                 answer.append(c);
             }
         }

         return answer.toString();
     }
}

시간복잡도: $O(N)$

$N$: 문자열 길이

 

4. 분석 및 참고사항

더 간단한 코드

public class Solution {
    public String solution(String s) {
        StringBuilder result = new StringBuilder();
        boolean isStart = true; 
        for (char c : s.toCharArray()) {
            if (isStart) {
                result.append(Character.toUpperCase(c));
            } else {
                result.append(Character.toLowerCase(c));
            }

            isStart = (c == ' '); 
        }

        return result.toString();
    }
}
  • 현재 문자가 공백이면 다음 문자가 단어 시작임을 캐치하는 것이 중요
  • 공백을 만나면 isStart 를 true 로 전환 → 다음 문자에 대문자 처리
  • 공백이나 숫자는 대문자 처리해도 변동이 없기 때문에 따로 처리할 필요 x

 

최적화 포인트

  • Split 지양: 공백 손실 때문에 직접 순회 방식이 안정적
  • Boolean 사용: 조건 부로 무언갈 조치할 때 적합
  • 필요 없는 기능 x: 문자인지 숫자인지 공백인지 굳이 판별해 가며 필요 없는 시간 낭비를 할지 않음
반응형

댓글