본문 바로가기
99클럽/6기

99클럽 코테 스터디 13일차 TIL - JadenCase 문자열 만들기

by nowjin 2025. 4. 16.

오늘의 학습 키워드

  • 문자열 처리
  • StringTokenizer
  • Character 클래스
  • 조건분기

공부한 내용 정리

오늘 풀었던 문제는 문자열에서 각 단어의 첫 문자는 대문자로, 나머지는 소문자로 변환하는 것이 목표였습니다.
다만 단순히 split(" ")을 쓰면 연속된 공백이 사라지기 때문에,
이를 해결하기 위해 StringTokenizer를 " " 공백을 포함한 토큰(true) 으로 활용했습니다.

각 토큰에서:

  • 공백이면 그대로 append(" ")
  • 단어이면 첫 글자를 char로 추출하고 나머지는 소문자로 변환 후
    • 첫 글자가 문자면 Character.toUpperCase()로 대문자화
    • 숫자거나 특수문자면 그대로 유지
      로직을 거쳐 StringBuilder에 이어붙이는 방식으로 구현했습니다.

소스코드

/*
입력: 공백으로 분리되어있는 문자 길이 1~200
로직: 일단 Token으로 String 분리 (공백으로)
     token의 맨 앞글자 char로 분리하고 token에서 charAt으로 0번제거
     그리고 나머지를 저장해놓고 모두 소문자로 해야됨.
     만약 맨앞에 숫자가 아니다. 
     isLetter 이면 [0]번 대문자로 해서 sb에 추가,
     나머지 소문자로해서 sb에 추가
     만약 먄앞에 숫자다.
     그럼 그냥 sb에 first랑 나머지 sb에 추가
     sb.toString으로 return
출력: 맨앞에 문자는 대문자. 나머지는 소문자
*/

import java.util.*;
class Solution {
    public String solution(String s) {
        StringTokenizer st = new StringTokenizer(s, " ", true);
        StringBuilder sb = new StringBuilder();
        
        while(st.hasMoreTokens()){
            String token = st.nextToken();
            if(token.equals(" "))
                sb.append(" ");
            else {
                // 맨 앞글자
                char first = token.charAt(0);
                // 맨 앞글자 제거하고 모두 소문자로
                String rest = token.substring(1).toLowerCase();
                
                if(Character.isLetter(first)) {
                    sb.append(Character.toUpperCase(first))
                        .append(rest);
                } else{
                    sb.append(first)
                        .append(rest);
                }
                
            }
                
        }
        
        return sb.toString();
    }
}

오늘의 회고

• 어떤 문제가 있었고, 나는 어떤 시도를 했는지

처음엔 split(" ")으로 단어를 나누려 했는데, 연속된 공백이 무시되어 의도한 결과가 나오지 않았습니다.
그래서 공백 자체도 하나의 토큰으로 인식하게끔 StringTokenizer(s, " ", true)를 사용했습니다.

 

• 어떻게 해결했는지

공백을 포함한 토큰 처리, 문자인지 숫자인지 조건 분기를 통해 정확하게 포맷팅이 되도록 했습니다.
Character.isLetter()를 사용해 첫 글자가 알파벳인지 판단하고 그에 따라 대문자/소문자 처리를 나눴습니다.

 

• 무엇을 새롭게 알았는지

StringTokenizer의 세 번째 인자 "true"를 주면 구분자인 " "도 포함한 채로 토큰화된다는 걸 정확히 이해하게 되었습니다.
또한, Character 클래스가 문자에 대한 다양한 정보를 제공한다는 점에서 문자열 문제를 해결할 때 매우 유용하다는 걸 다시 느꼈습니다.

 

 

 

• 내일 학습할 것은 무엇인지

내일은 문자열 관련 정규표현식 문제나, 조금 더 복잡한 문자열 파싱 문제를 도전해볼 예정입니다.