[String] 단어 첫글자를 대문자로

박채은·2022년 11월 24일
0

코딩테스트

목록 보기
3/52

문제

[코플릿 - letterCapitalize]


작성한 코드

public String letterCapitalize(String str) {
      int count=0;
      if(str.equals("")) return ""; // 빈 문자열인 경우
        
      char[] array = str.toCharArray(); // 문자열을 char 배열로 변환
      for(int i=0;i< array.length;i++){ // 문자열이 다 공백인 경우
          if(array[i]==' '){
              count++;
          }
       }
      if(count == array.length) return "";
        
      array[0] -= ('a'-'A');
      for(int i=1;i<array.length;i++){
      	// 전 요소가 공백이고, 현재 요소가 소문자인 경우에 대문자로 변경
          if(array[i-1]==' ' && array[i]<='z' && array[i]>='a'){
              array[i] -= ('a'-'A');
          }
      }
      return String.valueOf(array); // 해당 char 배열을 문자열으로 변경해서 리턴
}

시행착오

주의사항에 "빈 문자로만 이루어진 문자열을 입력하는 경우는 빈 문자열을 리턴합니다"를 처리하기 위해서 if 문 내에 Stream을 사용했다.
array의 요소 중에 공백인 것들을 필터링하고, 이를 count해주는 코드를 작성했는데 이 때 문제가 발생한다.

filter(e-> e.equals(' '))가 항상 false가 된다는 것이다!

그 이유가 무엇인지 찾아보았더니, char 형 배열은 stream을 사용할 수 없기 때문이다.

stream을 사용할 수 없기 때문에 해당 filter 내부에서 e는 char[] 형태의 자료를 반환하고 있고, 항상 false가 되는 것이다.


[잘못된 코드]

public String letterCapitalize(String str) {
        int count=0;
        if(str.equals("")) return ""; // 빈 문자열인 경우

        char[] array = str.toCharArray(); // 문자열을 char 배열로 변환
        
    	// 여기에서 문제 발생
        if(Stream.of(array)
                .filter(e-> e.equals(' '))
                .count() == array.length) return "";

        array[0] -= ('a'-'A');
        for(int i=1;i<array.length;i++){
            // 전 요소가 공백이고, 현재 요소가 소문자인 경우에 대문자로 변경
            if(array[i-1]==' ' && array[i]<='z' && array[i]>='a'){
                array[i] -= ('a'-'A');
            }
        }
        return String.valueOf(array); // 해당 char 배열을 문자열으로 변경해서 리턴
    }

깔끔한 코드

띄어쓰기 관련해서 나오면, split()을 사용하는 것이 좋다.

이 문제에서는 문자열을 변경하지 않고, 소문자만 대문자로 바꾸려고 한다.
split(" ")을 하면, 공백이 삭제되기 때문에 split으로 자르고 난 뒤에 다시 원 상태로 돌리기 위해서 join()을 사용하여 공백을 추가해야 한다.

전에 작성해둔 split() 관련 글을 참고하자!

public String letterCapitalize(String str) {
        if(str.length()==0) return ""; // 빈 문자열인 경우
        String[] words= str.split(" "); // 공백으로 문자 자르기
        String result="";

        for(int i =0;i<words.length;i++){
            if(words[i].length()==0){ // 공백이 연속이여서 빈 배열이 들어간 경우 -> 대문자로 바꾸는 과정을 넘어감
                continue;
            }
            words[i] = String.valueOf(words[i].charAt(0)).toUpperCase() + words[i].substring(1);
        }
        result = String.join(" ", words); // 공백으로 잘린 문자열 사이에 공백을 다시 넣어줌
        return result;
}

0개의 댓글