처음에 몇몇 테케에서 틀렸는데 원인을 알 수 없었다.
알고보니, 공백이 하나 이상일 수 있는데, 결과문자열에서 이 공백개수를 그대로 재현해야하는부분을 놓쳤었다.
나는 결과 문자열에 공백이 하나만 끼도록 했었던것이다.
import java.util.Arrays;
class Solution {
public String solution(String s) {
String answer = "";
String[] temp = s.split(" ");
for(int j=0; j<temp.length; j++) {
for(int i=0; i<temp[j].length(); i++) {
if(i%2==0) answer += Character.toUpperCase(temp[j].charAt(i));
else answer += Character.toLowerCase(temp[j].charAt(i));
}
temp[j] = answer;
answer ="";
}
int start = 0;
int count =0;
for(int i=0; i<temp.length; i++) {
int len = temp[i].length();
start += len+count;
count =0;
for(int j=start; j<s.length(); j++) {
if(!Character.isLetter(s.charAt(j))) count++;
if(Character.isLetter(s.charAt(j))) break;
}
answer += temp[i];
for(int k=0; k<count; k++) answer += " ";
}
return answer;
}
}
공백 개수를 동일하게 가져가기위한 코드가 지저분하다는 생각이 든다.
class Solution {
public String solution(String s) {
String answer = "";
int cnt = 0;
String[] array = s.split("");
for(String ss : array) {
cnt = ss.contains(" ") ? 0 : cnt + 1;
answer += cnt%2 == 0 ? ss.toLowerCase() : ss.toUpperCase();
}
return answer;
}
}
이렇게 간단히 구현할 수 있구나.
split을 사용하는건 동일하다.
하지만 이 풀이에서는 split(" ") 이 아닌, split("")으로 했다.
또한 for문안에서 삼항연산자를 사용해서 모든걸 해결했다.
split("")이걸 사용하면, 공백도 문자도 각각 하나씩 분리되서 들어간다!
삼항연산자를 사용해 공백이 없으면 카운트를 계속 +1해주고, 공백을 만나면 0으로 초기화한다.
카운트의 홀짝에따라 대소문자를 바꿔주는것도 삼항연산자를 사용한다.
class Solution {
public String solution(String s) {
String answer;
answer = s.toUpperCase();
char[] chars = answer.toCharArray();
//앞문자가 대문자라면 소문자로 치환
for (int i = 1; i < chars.length; i++) {
if (62 <= chars[i - 1] && chars[i - 1] <= 90) {
chars[i] = Character.toLowerCase(chars[i]);
}
}
answer = String.valueOf(chars);
return answer;
}
}
대문자로 다 바꿔두고, 앞문자가 대문자인지 체크해서 그 다음에는 소문자가 오게 할 수도 있다.