• [프로그래머스 LV.2] JadenCase 문자열 만들기 (java)

    2023. 4. 23.

    by. Sohyun

    출처 : 프로그래머스 코딩테스트 연습, https://school.programmers.co.kr/learn/courses/30/lessons/12951#

     

    - JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열

    - 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 (첫 번째 입출력 예 참고)
    - 문자열 s를 JadenCase로 바꾼 문자열을 리턴하기

     

    처음에 공백을 기준으로 split 해서 배열에 담고 첫글자만 대문자, 나머지만 소문자로 바꾸면 끝날 것 같았는데

    공백이 연속해서 나올 수 있다는 부분을 고려해주지 않아서 "    " -> "    " 이렇게 나와야 하는데 "    " -> "" 이렇게 나왔다.

     


    나의 풀이

     

    문자 단위가 아니라 한글자씩 쪼개서

    - 완전 첫 글자이면 대문자로,

    - 이후에 앞에 공백있으면 대문자, 아니면 소문자로 바꾼다.

     (아스키 코드 10진수에서 65 ~ 90 : 대문자,  97 ~ 122 : 소문자 이다.)

    class Solution {
        public String solution(String s) {
            StringBuilder sb = new StringBuilder();
            
            char[] cs = s.toCharArray();
            
            // 첫글자 처리
            int ci = (int)cs[0]; 
            String ss = String.valueOf(cs[0]);
            if((ci >= 65 && ci <= 90) || (ci >= 97 && ci <= 122)) {
                //문자이면 대문자로
                ss = ss.toUpperCase();
            }
            sb.append(ss);
            
            for(int i=1; i<cs.length; i++) {
                ss = String.valueOf(cs[i]);
                ci = (int)cs[i];
                if(cs[i-1] == ' ') {
                    // 문자이면 대문자로
                    if((ci >= 65 && ci <= 90) || (ci >= 97 && ci <= 122)) {
                        ss = ss.toUpperCase();
                    }
                } else {
                    // 문자이면 소문자로
                    if((ci >= 65 && ci <= 90) || (ci >= 97 && ci <= 122)) {
                        ss = ss.toLowerCase();
                    }
                }
                
                sb.append(ss);
            }
            return sb.toString();
        }
    }

     

     


    다른사람의 풀이를 보고

     

     

    공백도 숫자도 대소문자로 바꾸는 toUpperCase, toLowerCase를 통과할 수 있다는 것을 알게 되었다.

    공백인인지 아닌지만 확인하면 되도록 바꿀 수 있었다.

    class Solution {
        public String solution(String s) {
            StringBuilder sb = new StringBuilder();
            
            char[] cs = s.toCharArray();
            
            // 첫글자 처리
            String ss = String.valueOf(cs[0]).toUpperCase();
            sb.append(ss);
            
            for(int i=1; i<cs.length; i++) {
                if(cs[i-1] == ' ') {
                    ss = String.valueOf(cs[i]).toUpperCase();
                } else {
                    ss = String.valueOf(cs[i]).toLowerCase();
                }
                
                sb.append(ss);
            }
            return sb.toString();
        }
    }

    처음에 전부 소문자로 바꾼 후에 첫글자이거나 공백이후 문자이면 대문자로 바꾸는 방법도 있고,

     

    Character가 아니라 String 단위로 쪼개면 형변환 부분을 없애서 가독성을 높일 수 있었다.

    class Solution {
        public String solution(String s) {
            StringBuilder sb = new StringBuilder();
            s = s.toLowerCase();
            String[] cs = s.split("");
            
            sb.append(cs[0].toUpperCase());
            
            for(int i=1; i<cs.length; i++) {
                if(" ".equals(cs[i-1])) {
                    sb.append(cs[i].toUpperCase());
                } else {
                   sb.append(cs[i]); 
                } 
            }
            return sb.toString();
        }
    }

    그런데 형변환을 없앴다고 속도가 더 빨라지는 것은 아니었다.

    큰 차이는 아니었지만 char단위로 할때가 조금 더 빨랐다.

     

    문자열의 길이가 0보다 크다면 공백이 아닌 것으로 판단하고, 첫글자를 잘라서 대문자로, 나머지는 소문자로 변경한 풀이도 보았다...

    이렇게 하나 더 배워간다.

    댓글