티스토리 뷰

💻JAVA 코드 바로보기

 

 

 

문제 설명

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

 


제한사항

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

입출력 예

s return
"3people unFollowed me" "3people Unfollowed Me"
"for the last week" "For The Last Week"

 

 


🌼 JAVA 알고리즘

 

초기화면

출처 : 프로그래머스

 

 

 

풀이과정

공백을 기준으로 각 단어가 나누어지는 것을 확인했다
class Solution {
    public String solution(String s) {
        String answer = "";
        
        String[] spaced = s.split(" ");
        for (int i = 0; i < spaced.length; i++) {
            System.out.println(spaced[i]);
        }
        
        return answer;
    }
}

 

 

 

나누어진 각 단어의 첫글자(대문자로 바꿀 글자)를 확인하고,
해당 문자가 영문자일 경우 아스키코드를 사용하여 대문자로 교환했다
class Solution {
    public String solution(String s) {
        String answer = "";
        
        String[] spaced = s.split(" ");
        for (int i = 0; i < spaced.length; i++) {
            System.out.println(spaced[i].charAt(0));
        }
        
        return answer;
    }
}

class Solution {
    public String solution(String s) {
        String answer = "";
        
        String[] spaced = s.split(" ");
        for (int i = 0; i < spaced.length; i++) {
            char temp = spaced[i].charAt(0);
            if(temp>96&&temp<123) temp -= 32; 
            System.out.println(temp);
        }
        
        return answer;
    }
}

 

 

위와 같은 흐름으로 진행했을 때 테스트에서는 통과되었지만,
class Solution {
    public String solution(String s) {
        String answer = "";
        
        String[] spaced = s.split(" ");
        for (int i = 0; i < spaced.length; i++) {
            if(i!=0) answer += " ";
            //단어별 첫문자 대문자로 변경
            char upper = spaced[i].charAt(0);
            if(upper>='a'&&upper<='z') upper -= 32; 
            answer+=upper;
            //첫문자 제외한 모든 문자 소문자로 변경
            for(int j=1;j<spaced[i].length();j++){
                char lower = spaced[i].charAt(j);
                if(lower>='A'&&lower<='Z') lower += 32; 
                answer+=lower;
            }
            System.out.println(answer);
        }
        
        return answer;
    }
}

풀이방법이 깔끔하지 않아 걱정했는데, 
역시나 코드의 효율성이 많이 떨어져서인지 런타임에러가 발생했다

 

 

 

 

 

코드를 조금 더 단순화시키기 위해 split() 사용과 동시에 모든 문자를 소문자로 변경하도록 수정했다
class Solution {
    public String solution(String s) {
        String answer = "";
        
        //모든 문자 소문자로 변경
        String[] spaced = s.toLowerCase().split(" ");
        for (int i = 0; i < spaced.length; i++) {
            if(i!=0) answer += " ";
            System.out.println(spaced[i]);
            //첫문자를 대문자로 변경
            answer+= Character.toUpperCase(spaced[i].charAt(0));
            answer+= spaced[i].substring(1);
        }
        return answer;
    }
}

실행시간을 줄이기 위해 StringBuffer를 사용하는 방법도 있었지만, 나는 기존의 풀이방식을 이용하고 싶었다

 

 

 

 

 

 

 

 

 

 

완성코드

[질문하기]란에서 런타임 이슈를 찾아보니, 띄어쓰기의 조건을 세부적인것까지 지정해주어야 한다는 해결책이 있었다
1. 공백이 연속적으로 존재할 경우
2. 마지막 문자가 공백일 경우
class Solution {
    public String solution(String s) {
        String answer = "";
        
        //모든 문자 소문자로 변경 후 분리
        String[] spaced = s.toLowerCase().split(" ");
 
        for (int i = 0; i < spaced.length; i++) {
            //기본 띄어쓰기 적용
            if(i!=0) answer += " ";
            //띄어쓰기별 각 단어 temp
            String temp = spaced[i];
            //연속된 공백일경우
            if ("".equals(temp)) { 
                answer += temp;
            } 
            //첫문자가 영대소문자일 경우 규칙적용
            else if(spaced[i].charAt(0)>='A'&&spaced[i].charAt(0)<='z'){
                answer += Character.toUpperCase(temp.charAt(0)) + temp.substring(1);
            } 
            //첫문자가 영대소문자가 아닌 경우(숫자)
            else {
                answer += temp;
            }
        }
        //마지막 문자가 공백일경우
        if (" ".equals(s.substring(s.length()-1))) 
            answer += " ";
 
        return answer;
    }
}

완성 코드

 

 

 

댓글