221020 TIL 무엇 하나 쉬운게 없는 하루(feat. JadenCase 문자열 만들기)

이번 주의 핵심은 프로젝트 기획이지만 오늘은 코딩 도장 시간에 자바스크립트로 풀지 못한 JadenCase문자열 만들기 문제에 대해 글을 쓰려고 한다. 사실 어제 자바로 풀었던 문제라서 오늘은 금방 풀겠지 생각을 하고 어제 풀었던 방법과 다르게 풀려고 시도를 했는데 결국 1시간 내에 풀지 못했다. 다른 동료들은 모두 제 시간에 푼 것 같았는데 혼자 풀지 못해서 저녁 먹고 나서 다시 코딩 도장 문제에 도전을 했다.


어제는 자바에서 split을 사용해 공백을 기준으로 나눠 푸는 방법을 사용했었는데 공백이 연속일 때의 조건을 생각하지 못해 애를 먹어서 오늘은 split을 사용하지 않고 풀 수 있는 방법을 모색했다.

문자열의 맨 처음 단어가 대문자이고 모든 단어는 서문자로 변환해야하는 문제였다. 일차적으로 한문자 한문자 반복해서 변환을 해줘야 한다는 관점으로 문제를 접근했기 때문에 map메서드를 사용해야겠다고 생각했다.
하지만 map메서드를 사용하기 위해서는 배열형태여야 하는데 변환해야 하는 문자들은 문자열로 주어졌기 때문에 배열에 하나씩 넣어줘야 했다.

 

function toArray(sentence) {
  return [...sentence];
}


이후에 map메서드를 활용해서 배열안에 담긴 문자를 조건에 맞게 변환해주면 됐는데 공백 기준 맨 앞 문자만 대문자여야 했는데 문자열 중간중간에 대문자가 들어올 수도 있었기 때문에 위의 과정들을 진행하기 전에 모든 문자를 소문자로 변환을 해주었다.

function convertToLowerCase(sentence) {
  return sentence.toLowerCase();
}


이후 map으로 어떻게 앞 문자만 대문자로 바꿔줄까 생각을 하다 map으로 공백의 index를 얻어와 그 index에 +1을 더해서 공백 뒤의 문자를 대문자로 변경해주면 되겠다고 생각을 하고 코드를 작성하고 테스트를 돌렸더니 실패를 했다. 공백이 연속으로 오는 경우에는 위의 방법이 쓸모가 없어졌다. 공백이 연속으로 있을 때를 대비해 다른 방법을 모색해야 했다.

 

그래서 생각해낸 방법이 자기 문자의 앞에 오는 문자가 공백이면 대문자로 변경하는 것이였다. 이렇게 하면 공백이 몇 개가 연속으로 오든 맨 마지막 공백 하나만 검사하는 식이 되니까 상관이 없었다.

function firstWordConvertToUpperCase(lowerCaseSentence) {
  return lowerCaseSentence.map((word, index) => {
    if (lowerCaseSentence[index - 1] === ' ' || index === 0) {
      return word.toUpperCase();
    }

    return word;
  }).join('');
}

기존에는 이렇게 if문으로 풀었는데 지금 보니까 삼항연산자를 이용하면 처음에 모든 문자를 소문자로 변경해주는 메서드도 필요가 없다는 것을 발견했다.

 

위의 코드를 리팩터링 후

function firstWordConvertToUpperCase(lowerCaseSentence) {
  return lowerCaseSentence.map((word, index) => (
    lowerCaseSentence[index - 1] === ' ' || index === 0
      ? word.toUpperCase()
      : word.toLowerCase()))
    .join('');
}

이런식으로 모든 문자의 맨 처음 일 때와 앞의 문자가 공백일 때는 대문자로 변경하고 나머지는 소문자로 변경하면 간단하게 풀 수 있는 문제였다.

 

최종 코드

function toArray(sentence) {
  return [...sentence];
}

function firstWordConvertToUpperCase(array) {
  return array.map((word, index) => (
    array[index - 1] === ' ' || index === 0
      ? word.toUpperCase()
      : word.toLowerCase()))
    .join('');
}

function solution(sentence) {
  const array = toArray(sentence);

  return firstWordConvertToUpperCase(array);
}