본문 바로가기

1일1알고리즘

Alternate capitalization, toUpperCase() { [native code] } | Codewars [자바스크립트]

Codewars 7kyu 문제 Alternate capitalization.

 

Codewars: Achieve mastery through challenge

Codewars is where developers achieve code mastery through challenge. Train on kata in the dojo and reach your highest potential.

www.codewars.com

소문자 문자열이 주어짐. 문자열의 짝수 번째 글자들만 대문자로 한 번 변환하고 문자열의 홀수 번째 글자들만 또 따로 대문자로 변환. 변환한 값을 각각 배열에 담아서 찍어내는 문제.

 

function capitalize(s){
  let answer = [];

  const answerOne = capitalizeEvenIndex(s);
  const answerTwo = capitalizeOddIndex(s);
  
  answer.push(answerOne);
  answer.push(answerTwo);
  
  return answer;
};

function capitalizeEvenIndex(input) {
  let result = "";
  
  for (let i = 0; i < input.length; i++) {
    if (i % 2 === 0) {
      result += input[i].toUpperCase;
    } else {
      result += input[i];
    }
  }
  
  return result;
}

function capitalizeOddIndex(input) {
  let result = "";
  
  for (let i = 0; i < input.length; i++) {
    if (i % 2 !== 0) {
      result += input[i].toUpperCase;
    } else {
      result += input[i];
    }
  }
  
  return result;
}

짝수 번째 글자를 대문자로 바꿔주는 함수, 홀수 번째 글자를 대문자로 변환하는 함수를 하나씩 만들고 입력값을 각각 돌림. 각 함수에서 나온 값을 빈 배열에 밀어넣고 찍어내기.

 

될 것 같은데 자꾸 안되고 toUpperCase() { [native code] }라는 엉뚱한 값만 나옴.

다시 보니 toUpperCase 뒤에 ()를 안 붙였던 것. 즉 함수를 부르지 않아 함수 자체가 찍혀나옴.

 

function capitalize(s){
  let answer = [];

  const answerOne = capitalizeEvenIndex(s);
  const answerTwo = capitalizeOddIndex(s);
  
  answer.push(answerOne);
  answer.push(answerTwo);
  
  return answer;
};

function capitalizeEvenIndex(input) {
  let result = "";
  
  for (let i = 0; i < input.length; i++) {
    if (i % 2 === 0) {
      result += input[i].toUpperCase();
    } else {
      result += input[i];
    }
  }
  
  return result;
}

function capitalizeOddIndex(input) {
  let result = "";
  
  for (let i = 0; i < input.length; i++) {
    if (i % 2 !== 0) {
      result += input[i].toUpperCase();
    } else {
      result += input[i];
    }
  }
  
  return result;
}

이렇게 붙이니까 정상 작동함.

 

좀 단순하게 다시 써봄. 위 해결책들은 입력값을 두 번 돌아야 한다면 아래는 루프를 한 번만 돌면 됨.

function capitalize(s){
  let answerOne = "";
  let answerTwo = "";
  
  for (let i = 0; i < s.length; i++) {
    if (i % 2 === 0) {
      answerOne += s[i].toUpperCase();
      answerTwo += s[i];
    } else {
      answerOne += s[i];
      answerTwo += s[i].toUpperCase();
    }
  }
  
  return [answerOne, answerTwo];
};

 

다른 답변들을 보니 map()이라는 걸 많이 쓰는듯. 내일 공부해보기로.