문제 이해
문제를 풀고 보니 제한 조건의 '공백문자가 연속될 수 있다'라는 조건이 중요하다는 것을 알았다. 다른 내용은 설명처럼 공백 기준 첫글자만 대문자여야한다는 것이다.
내 풀이
function solution(s) {
var answer = s.toLowerCase().split(' ');
for(const idx in answer) {
if (!answer[idx]) {
continue;
}
answer[idx] = answer[idx][0].toUpperCase() + answer[idx].slice(1);
}
return answer.join(' ');
}
나는 보통 문제에서 설명한 그대로를 코드로 작성하는 편이다. 그래서 모두 소문자로 바꾼 후 공백을 기준으로 `split`한 후 첫문자만 대문자로 바꿔주었다.
여기서 for문에 있는 if문이 처음에는 없었는데, '런타임 에러'가 발생했다. 그래서 질문 게시판을 찾아보니 공백이 연속될 수 있어서 오류가 날 수 있다는 답변을 보았는데, 이것이 힌트가 되었다.
내 풀이 오류
위에 말한 것처럼 `s = "for the last week"`와 같이 ` `이 연속된 경우 `s.split(' ') = ['for', '', 'last, 'week']`가 반환된다. 이때 두번째 빈 문자열에서 0번째 인덱스를 불러오게 되면 런타임 에러가 발생하는 것을 확인했다. 이 경우를 처리하기 위해 if문을 추가했다.
다른 사람 풀이
function solution(s) {
return s.split(" ").map(v => v.charAt(0).toUpperCase() + v.substring(1).toLowerCase()).join(" ");
}
다른 사람 풀이도 큰 틀에서보면 내 풀이와 같다. 차이점이 있다면 조건문으로 빈 문자열을 처리하지 않았다는 것이다. 차이점이 무엇일까?
`string[i]` vs `string.charAt(i)`
차이점은 문자열을 인덱스로 가져올 때에 있다. `string[i]`는 `i`번째 위치의 값이 없다면 `undefined`를 반환하지만 `string.charAt(i)`는 `i`번째 값이 없으면 빈 문자열 `''`을 반환한다. 따라서 런타임 에러가 발생하지 않은 것이었다.
const str = 'hello';
console.log(str[5]) // undefined
console.log(str['asdf']) // undefined
console.log(str.charAt(5)) // ''
console.log(str.charAt('asdf')) // 'h'
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[JS] 의상 (+ 배열 `reduce` 메소드) (0) | 2024.09.12 |
---|---|
[JS] 괄호 회전하기 (0) | 2024.09.06 |
[JS] 공원 산책 (+ 단축 평가) (0) | 2024.08.20 |
[JS] 달리기 경주 (0) | 2024.08.19 |
[JS] 햄버거 만들기 (0) | 2024.08.14 |