문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
s | return |
---|---|
"try hello world" | "TrY HeLlO WoRlD" |
"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.
function solution(s) {
//문자를 단어 단위로 나눔
let word = s.split(' ');
let answer = [];
//문자를 글자 단위로 나누어 검사
//짝수 번째 인덱스에 있다면 대문자, 홀수 번쨰라면 소문자로 변환
for (value of word){
answer.push(value
.split('')
.map((element,index) =>
index % 2 === 0 ? element.toUpperCase() : element.toLowerCase())
.join(''))
}
//문자 단위로 나뉘어 있으므로 join 중간에 공백을 넣어 합쳐줌
return answer.join(' ');
}
풀긴 풀었는데 가독성이 떨어져서 고민이 많은 문제였다. 그래서 다른 사람의 풀이를 참고해서 가독성을 높이는 방법을 고민해 봤다.
function toWeirdCase(s){
return s.toUpperCase().replace(/(\w)(\w)/g, function(a){return a[0].toUpperCase()+a[1].toLowerCase();})
}
여기서는 정규식과 replace()
함수를 사용해 줬다. 두 글자가 연속되는 문자(\w)(\w) 전체를 찾은 후 function(a)함수로 바꿔 줬다.
나는 문자열 자릿수는 인덱스로 찾을 수 없는줄 알고 굳이 문자열을 나눈 다음 배열로 바꿔 줬는데, 문자열[index]이런 식으로 쓰면 인덱스에 맞는 문자를 찾을 수 있다. try hello world[0]은 t이다. 공백도 글자수에 포함된다. 그래서 찾은 연속된 두자리 중 첫 번째 문자는 대문자로, 두 번째 문자는 소문자로 바꿔 자릿수가 홀수일 때와 짝수일 때를 구분해 주었다.
function toWeirdCase(s){
return s.split(' ').map(i => i.split('').map((j, key) => key % 2 === 0 ? j.toUpperCase() : j).join('')).join(' ')
}
console.log(toWeirdCase(Try Hello World));
나는 for을 이용하여 배열을 검수해 줬는데 map()
을 중첩하여 사용해 줬다는 차이가 있다. 일단 참고로 들고는 왔는데 가독성은 여전히 떨어져 보이긴 한다.