코딩테스트/프로그래머스

[JS] JadenCase 문자열 만들기 (+ string[i] vs string.charAt(i))

joycie416 2024. 8. 27. 09:48

 

문제 이해

문제를 풀고 보니 제한 조건의 '공백문자가 연속될 수 있다'라는 조건이 중요하다는 것을 알았다. 다른 내용은 설명처럼 공백 기준 첫글자만 대문자여야한다는 것이다.

 

 

내 풀이

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