입력되는 문자열에는 두 번 이상 연속된 공백이 포함되어 있다.
공백이야 그렇다 쳐도, 문자열이 변경 불가능(immutable)하다는 점을 유의해서 풀지 않으면 아무리 이리저리 해봐도 입력된 문자열이 하나도 안 바뀐 채 그대로 리턴되어 가슴이 매우 답답해질 것.
function letterCapitalize(str) {
let arr = str.split(' ');
let result = [];
for(let i = 0; i < arr.length; i++) {
if(arr[i].length > 0) {
result[i] = arr[i][0].toUpperCase() + arr[i].slice(1);
} else {
result[i] = arr[i];
}
}
let returnedStr = result.join(' ');
return returnedStr
}
console.log(letterCapitalize(' nEVER gIVE uP ')) // ' NEVER GIVE UP '
문자열 상태에서는 백날 지지고 볶아봐도 대문자로 안 바뀐다. 객체와 배열을 제외한 모든 자료형, 가령 string, number, boolean, undefined 같은 것들은 변경 불가능(immutable) 하기 때문이다. 그래서 split() 메서드를 사용해 공백 한 칸을 기준으로 배열에 나눠 담는다.
그리고 for문을 돌리는데, 이 배열의 요소 중에는 공백도 포함되어 있으므로 공백은 빼고 문자열 요소에만 대문자화를 적용해야 오류가 생기지 않을거다. arr.split(' ') 가 이중공백에 적용되면 빈 문자열이 배열에 추가되므로, arr[i]의 length 가 0을 초과하는지를 판단하는 것으로 문자열 요소만 걸러낼 수 있다.
arr[i]의 첫 글자만 똑 떼서(arr[i][0]) 대문자로 바꾸고, 여기에 arr[i]에서 0번 인덱스만 뺀 사본을 만들어서(arr[i].slice(1)) 이걸 뒤에 붙여준다. 그리고 요걸 result 의 i번째 인덱스에 담아넣는다. 좋아!
배열의 요소가 비어 있으면 비어있는 대로 result[i]에 담는다. 나중에 join 할 때 다시 공백으로 뿅 돌아올거다.
완성된 result 배열을 join(' ')을 사용해서 다시 문자열 형태로 변환한다. 완성!