문자열
s
는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
- 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
- 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
- 입출력 예 설명
:"try hello world"
는 세 단어"try"
,"hello"
,"world"
로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면"TrY"
,"HeLlO"
,"WoRlD"
입니다. 따라서"TrY HeLlO WoRlD"
를 리턴합니다.
❌ 문자열
s
의 문자들을toLowerCase()
를 통해 모두 소문자로 변환한 후, 짝수 인덱스만toUpperCase()
로 바꿀 수 있도록 로직을 짜보았다.
split(" ")
을 통해 문장을 공백 단위로 잘라서 각 단어들을 배열word[]
에 담아주고, 각 단어를 다시split("")
으로 한 문자씩 잘라서 배열str[]
에 담아 단어별로 각 문자의 인덱스가 짝수이면 대문자로 변환해주었다. 변환 작업이 끝나면 String 클래스의join(구분자, 배열)
을 사용하여 String 타입의 배열을 문자열로 간단하게 만들 수 있다! 해당 작업을 모든 단어에 끝낸 후 최종적으로String.join(" ", word)
를 리턴해주면word[]
의 각 단어를 공백을 기준으로 결합해서 최종 문장을 리턴할 수 있다.
아래 코드로 테스트 케이스는 통과했는데, 어째서인지 실제 제출에서는 몇 개의 케이스에서 실패가 떴다,,
class Solution {
public String solution(String s) {
s = s.toLowerCase();
String[] word = s.split(" ");
for(int i=0;i<word.length;i++) {
String[] str = word[i].split("");
for(int j=0;j<str.length;j++) {
if(j%2 == 0) str[j] = str[j].toUpperCase();
}
word[i] = String.join("", str);
}
return String.join(" ", word);
}
}
✅ 다른 사람들의 질문들과 코드를 보니, 문장의 가장 앞 뒤에 공백이 들어가거나, 공백이 하나 이상인 경우에는 공백 자체를 문자열로 취급해서 리턴해줘야 한다고 한다. 예를 들어,
s
가" aaa "
인 경우, 공백을 포함해서" AaA "
를 리턴해야 한다.
위 코드처럼split(" ")
로 문자열을 분리하면 공백을 모두 제거하므로 단어aaa
만word[]
에 담겨서 제대로 된 문장을 리턴할 수 없게 된다.split(" ")
에 한계치로 -1을 넣어줌으로써 해결할 수 있었다 :split(" ", -1)
. 한계치에 -1을 넣으면 분할 수에 제한이 없으므로, 공백을 기준으로 최대한 많이 분할할 수 있게 되어 공백또한 분할 대상에 포함되는 것이다.
class Solution {
public String solution(String s) {
s = s.toLowerCase();
String[] word = s.split(" ", -1);
for(int i=0;i<word.length;i++) {
String[] str = word[i].split("");
for(int j=0;j<str.length;j++) {
if(j%2 == 0) str[j] = str[j].toUpperCase();
}
word[i] = String.join("", str);
}
return String.join(" ", word);
}
}