와드의 블로그

JadenCase 문자열 만들기 본문

PS/프로그래머스

JadenCase 문자열 만들기

Ward 2026. 4. 23. 20:43

문제

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

  • 입력: 알파벳, 숫자, 공백으로 이루어진 문자열 s (길이 1 이상 200 이하)
  • 출력: JadenCase로 변환된 문자열
  • 주의사항: 숫자는 단어의 첫 문자로만 나옵니다. 숫자로만 이루어진 단어는 없습니다. 공백문자가 연속해서 나올 수 있습니다.

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

풀이 1: 플래그(Flag) 변수 활용

"다음 문자가 단어의 첫 글자인가?"를 기억하는 논리형(boolean) 플래그 변수를 두어 단어의 첫 글자를 판단합니다.

  • 초기화: isFirst 플래그를 true로 설정하여 맨 처음 등장하는 문자는 무조건 첫 글자로 취급합니다. 모든 문자열을 소문자로 변환(s.toLowerCase())한 뒤 문자 배열로 쪼개어 순회합니다.
  • 대소문자 판별 및 추가: isFirst가 참이라면 대문자로 변환(Character.toUpperCase(c))하여 추가하고, 거짓이라면 이미 소문자로 변환되어 있는 문자 c를 그대로 추가합니다.
  • 상태 갱신: 방금 처리한 문자 c가 공백(' ')이었다면, 이어지는 다음 문자는 무조건 새로운 단어의 첫 글자가 되므로 isFirst를 true로 만듭니다. 공백이 아니었다면 단어가 계속 이어지는 중이므로 false로 만듭니다.

코드 1

class Solution {
    public String solution(String s) {
        StringBuilder sb = new StringBuilder();
        boolean isFirst = true; // 현재 문자가 단어의 첫 글자인지 판별

        // 1. 전체를 소문자로 변환 후 한 글자씩 순회
        for (char c : s.toLowerCase().toCharArray()) {
            
            // 2. 첫 글자면 대문자로 변환, 아니면 그대로 덧붙임
            sb.append(isFirst ? Character.toUpperCase(c) : c);
            
            // 3. 현재 문자가 공백이라면 다음 문자는 무조건 첫 글자가 됨
            isFirst = (c == ' '); 
        }

        return sb.toString();
    }
}

풀이 2: 이전 인덱스를 직접 탐색하는 방식

문자열의 인덱스를 직접 제어하며 앞 문자의 상태를 확인하는 시뮬레이션 방식입니다.

  • 단어의 시작점 판별: 현재 인덱스 i가 0이거나, 바로 앞 글자(s.charAt(i - 1))가 공백인 경우를 단어의 시작점으로 간주합니다.
  • 대문자 변환 (ASCII 연산): 단어의 시작점이면서 알파벳 소문자(c >= 'a' && c <= 'z')라면, 자바의 내장 함수에 의존하지 않고 아스키코드 연산(c - 'a' + 'A')을 통해 직접 대문자로 변환합니다.
  • 그 외의 경우: 시작점이 아닌 문자나 연속된 공백 등은 이미 처음에 toLowerCase()로 치환해둔 원본 소문자 상태 그대로 이어 붙입니다.

코드 2

class Solution {
    public String solution(String s) {
        s = s.toLowerCase();
        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; i < s.length(); i++) {
            // 단어의 시작점(첫 글자이거나, 앞 글자가 공백)인지 판별
            if (i == 0 || s.charAt(i - 1) == ' ') {
                char c = s.charAt(i);
                // 소문자 알파벳이라면 대문자로 변환
                if (c >= 'a' && c <= 'z') {
                    sb.append((char)(c - 'a' + 'A'));
                } else {
                    sb.append(c);
                }
            } 
            // 단어의 시작점이 아니라면 그대로 추가
            else {
                sb.append(s.charAt(i));
            }
        }
        
        return sb.toString();
    }
}

알고리즘 분류

문자열 (String), 파싱 (Parsing)

'PS > 프로그래머스' 카테고리의 다른 글

숫자의 표현  (2) 2026.04.23
이진 변환 반복하기  (0) 2026.04.23
연속된 부분 수열의 합  (0) 2026.04.21
2개 이하로 다른 비트  (1) 2026.04.20
튜플  (0) 2026.04.19