⭐️ 코드
class Solution {
public String solution(String s) {
String answer = "";
String[] sArr = s.toLowerCase().split(" ");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < sArr.length; i++) {
if (sArr[i].length() != 0) {
sb.append(sArr[i].substring(0, 1).toUpperCase());
sb.append(sArr[i].substring(1, sArr[i].length()));
}
sb.append(" ");
}
if(!(" ".equals(s.substring(s.length()-1, s.length())))) {
sb.deleteCharAt(sb.lastIndexOf(" "));
}
return sb.toString();
}
}
💡 문제 풀이
이 문제는 제한 조건을 잘 봐야 한다.
문제에서 공백문자는 연속해서 나올 수 있고, 마지막에 공백문자가 나올 수 있다는 것을 명심해야 한다.
우리는 split()과 substring() 메서드를 사용할 것이며, 잘 모른다면 아래 포스트를 보고 오자
먼저 split() 함수는 () 안에 지정한 문자를 기준으로 나누게 된다.
(" ") 라면 공백 한 칸 기준으로 나뉘게 되는데 제한 사항에서 공백은 여려 개가 올 수 있다고 한다.
그렇다면 " " 2칸의 공백은 " " 한 칸의 공백으로 split 하게 되면 split을 수행한 String 배열에 "" 공백이 삽입된다.
"3people Unfollowed Me"를 공백을 한 칸씩 추가하여 split(" ")을 수행하게 되면 아래와 같이 출력된다.
따라서 이번 문제에서는 위 사례를 생각하고 풀어야 한다.
String[] sArr = s.toLowerCase().split(" ");
먼저 JadenCase는 맨 처음 글자가 대문자이고, 이후의 이어지는 글자는 소문자여야 하기 때문에 모두 LowerCase() 메서드로 소문자화 해주고 시작한다.
StringBuilder sb = new StringBuilder();
문자열의 연산이기 때문에 StringBuilder() 내장함수를 이용해 주면 더 빠르기 때문에 StringBuilder를 사용하고 아래 연산을 수행해 보자.
for (int i = 0; i < sArr.length; i++) {
if (sArr[i].length() != 0) {
sb.append(sArr[i].substring(0, 1).toUpperCase());
sb.append(sArr[i].substring(1, sArr[i].length()));
}
sb.append(" ");
}
sArr 배열에서 공백이 있다면 문자열에서 공백이 두 번 연속으로 있었다는 뜻이며, sArr [i]의 length는 0이 되는 경우다. 공백이 두 개가 나왔으니까 완성될 문자열에 sb.append(" ");로 공백을 한 칸 추가해 준다.
그 후 sArr [i]가 0이 아닌 경우에 첫 글자를 대문자로 바꾸는 연산을 하면 된다.
간단하게 substring() 메서드를 이용하여 연산을 해주면 되고, 마지막에 띄어쓰기를 한 칸씩 하기 때문에 띄어쓰기용 공백을 한 칸 추가해 준다.
완성된 문자열은 맨 뒤에 공백이 한 칸 삽입되어 있을 것이다.
따라서 마지막의 공백은 제거해 주는 연산을 하면 되는데
if(!(" ".equals(s.substring(s.length()-1, s.length())))) {
sb.deleteCharAt(sb.lastIndexOf(" "));
}
실제 문자열에서 마지막에 공백이 있었는지를 체크한 다음 공백 제거를 진행할지 말지 결정해야 한다. 그래서 위의 식을 꼭 넣어서 수행해 줘야 한다.
실패 코드
String[] sArr = s.split(" ");
System.out.println(Arrays.toString(sArr));
StringBuilder sb = new StringBuilder();
for(int i = 0; i<sArr.length; i++) {
char c = sArr[i].charAt(0);
// 첫 글자가 숫자일 때
if (c < 'a' || c == ' ') {
sArr[i] = sArr[i].toLowerCase();
sb.append(sArr[i]);
}
// 첫 글자가 문자일 때
else if (('A' < c && c > 'Z') || ('a' < c && c > 'z')) {
sArr[i] = sArr[i].toLowerCase();
sb.append(sArr[i].substring(0, 1).toUpperCase());
sb.append(sArr[i].substring(1, sArr[i].length()));
}
if(i < sArr.length-1 ){
sb.append(" ");
}
}
return sb.toString();
👀 후기
제한 조건을 꼭 잘 보자...
안 보고 막 풀다 하나 막히니까 너무 돌아가게 된다...