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;
}