첫째, function solution(s)의 모든 알파벳을 소문자로 변경
둘째, 띄어쓰기 기준으로 내용을 자른다.
셋째, map을 통해서 문자열의 0번지를 대문자로 변경하고
넷째, slice를 이용해서 1번지부터 끝까지를 더한다.
다섯째, 그리고 join()을 통해서 띄어쓰기로 합친다.
function solution(s) {
return s.toLowerCase().split(" ")
.map(el => el[0].toUpperCase()+el.slice(1))
.join(" ")
}
정확성: 44.4% (8/18)
TypeError: Cannot read properties of undefined (reading 'toUpperCase')
제한조건을 보면, 공백문자가 연속해서 나올 수 있다는 내용이 있다. 예를 들어서 "3aaa aa bb aa aa bb"
이 변수로 주어진다고 하자. bb 앞에는 "띄어쓰기\t띄어쓰기"
와 같이 두번 이상의 띄어쓰기가 있다고 하자. 그러한 경우 map함수에서 이를 인식하지 못한다. 그 결과 타입에러가 발생한다. el[0]가 존재하지 않기 때문이다.
이 경우 조건을 통하여 아래와 같이 코드를 수정함으로 문제에 접근할 수 있다. 즉 값이 존재하면 조건을 수행하는 것이다.
function solution(s) {
console.log(s.toLowerCase().split(" "))
return s.toLowerCase().split(" ")
.map(el => el && el[0].toUpperCase()+el.slice(1))
.join(" ")
}
.map((v) => v.charAt(0).toUpperCase() + v.substring(1))
다른사람의 풀이를 보면 charAt()과 substring()이 사용되었다.
mdn 문서를 보면, charAt()은 "문자열에서 특정 인덱스에 위치하는 유니코드 단일문자를 반환"하는 메서드이고, substring()은 문자열의 시작 인덱스로부터 종료 인덱스 전까지 문자열의 부분 문자를 반환한다. 첫번째 인수는 시작점이고, 두번째 인수는 종료점인 것이다. 만약 두번째 인수를 기록하지 않으면 끝까지를 반환한다.
두 코드의 차이는 첫 문자에 접근했을 때이다. " "에 있어서 el(0)은 undefined이기에 런타임시 오류가 발생된다.
그러나 GPT에 따르면 charAt()는 " " 해당 시나리오를 보다 우아하게 처리한다. charAt()은 인덱스에 해당하는 문자를 찾을 수 없는 경우 빈 문자열을 반환한다. passing 하는 것이다. 즉 에러를 발생시키지 않고 통과한다.
가장 간단한 방식은 정규식으로 해당 코드를 살펴보는 것이다.
function solution(s) {
return s.toLowerCase().replace(/(^|\s)\S/g, (match) => match.toUpperCase());
}
정규식에서 찾은 내용을 반복적으로 매개변수로 받아서 대문자로 변경한다. 문제는 정규표현식에 대한 독해이다.
/ /g
: 입력받은 내용에서 조건에 충족하는 모든 일치 항목을 검색한다.(^|\s)
(^|...)는 문자열의 시작을 나타내고, \s는 공백문자를 나타낸다. \S
: 공백이 아닌 모든 문자를 일치시킨다.정리하면 문자의 시작이거나 공백 다음에 오는 대상이 \S 문자인 경우에 해당 조건이 수행된다. 이를 통해서 문제를 풀어나갈 수도 있다.