본문 바로가기

알고리즘

프로그래머스 - JadenCase 문자열 만들기

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

 

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

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요. 제한 조건

programmers.co.kr

문제 설명

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요. 제한 조건

  • s는 길이 1 이상인 문자열입니다.
  • s는 알파벳과 공백문자(" ")로 이루어져 있습니다.
  • 첫 문자가 영문이 아닐때에는 이어지는 영문은 소문자로 씁니다. ( 첫 번째 입출력 예 참고 )

문제 풀이

문제를 해석해보면 공백을 기준으로 문자를 나눈 후에 첫 문자는 대문자, 나머지는 소문자로 변환해야 하며 첫 문자가 숫자일 경우에는 패스한다.라고 생각했습니다.

공백을 기준으로 나누므로 split을 활용하는 방식으로 풀이를 시도했고, String의 연산이 많이 발생할 것 같아 StringBuilder를 사용했습니다.

이후에는 firstUpper라는 첫 문자를 대문자로 변환하는 매서드를 따로 정의하였습니다. 그리고 공백을 기준으로 나눈 문자열 배열을 순환하며 변환된 문자열을 StringBuilder의 appned 연산으로 추가하여 풀이했습니다.

이 문제에서 맨 앞의 이 코드를 제거하고 코드를 제출하면 테스트 케이스 8번이 틀리게 됩니다. 저도 이 부분은 다른 분의 질문하기 의견을 보고 파악했는데 마지막 문자를 공백으로 주는 케이스가 있어서 이 부분의 처리가 필요합니다.

if(s.substring(s.length() - 1, s.length()).equals(" ")) {
                strArr[strArr.length-1] += " ";}

나의 코드

class Solution {
        public String solution(String s) {

            String[] strArr = s.split(" ");

            if(s.substring(s.length() - 1, s.length()).equals(" ")) {
                strArr[strArr.length-1] += " ";
            }

            StringBuilder answer = new StringBuilder();

            for(int i=0; i<strArr.length; i++){
                answer.append(fisrtUpper(strArr[i]));
                answer.append(" ");
            }

            answer.setLength(answer.length() - 1);

            return String.valueOf(answer);

        }

        public StringBuilder fisrtUpper(String str){
            int idx=0;

            StringBuilder stringBuilder = new StringBuilder();

            for(int i=0; i<str.length(); i++){
                
                if(Character.isDigit(str.charAt(i)) && i == 0){
                    stringBuilder.append(str.charAt(i));
                } else if(!Character.isDigit(str.charAt(idx)) && i == 0){
                    stringBuilder.append(Character.toUpperCase(str.charAt(i)));
                } else {
                    stringBuilder.append(Character.toLowerCase(str.charAt(i)));
                }

            }

            return stringBuilder;
        }
    }