[wecode] Code Kata - JavaScript # 2

hang_kem_0531·2022년 5월 11일
0

wecode

목록 보기
17/28
post-thumbnail

문제

reverse 함수에 정수인 숫자를 인자로 받습니다. 그 숫자를 뒤집어서 return해주세요.

x: 숫자 return: 뒤집어진 숫자를 반환!

예들 들어, x: 1234 return: 4321

x: -1234 return: -4321

x: 1230 return: 321

내 풀이

1차 풀이

const reverse = x => {
  const makeArr = String(Math.abs(x)).split('').reverse();
  const makeNum = Number(makeArr.join(''));

  if (makeArr[0] === '0' && x < 0) {
    makeArr.shift();
    return -makeNum;
  } else if (x < 0) {
    return -makeNum;
  } else if (makeArr[0] === '0') {
    makeArr.shift();
    return makeNum;
  } else {
    return makeNum;
  }   

}

정말 끔찍한 코드다.. 우선 문제가 요구하는 return 값은 주어진 숫자를 뒤집어서 반환하는 것이기 때문에, 이를 구현하려면 주어진 숫자를 배열로 만들어 그 배열을 reverse한 후에, 다시 숫자로 바꾸어 반환하면 될 것이라 생각했다.

Math.abs() 함수를 통해 x의 절댓값을 구하고, 이를 String 함수의 인자로 주어 문자열로 변환해 주었다. 그리고 split('') 함수로 각 숫자들을 배열의 인덱스로 만들어 준 뒤, reverse() 함수를 통해 배열의 순서를 뒤집어 주었다.

뒤집힌 배열을 다시 문자열로 만드려면, join() 함수를 사용해야 하는데, 여기서 인자에 ''을 준 이유는, 문자열이 구분없이 연결되어 반환되어야 하기 때문이다. 그리고 다시 이 문자열을 숫자로 바꾸기 위해 Number() 함수 안에 인자로 넣어주었다.

여기서 문제가 생기는데, 문제에서 숫자를 뒤집었을 때 앞자리가 0인 숫자는 0을 제외하고, 음수인 숫자는 -를 붙여서 return 하라는 조건이 있었다. 앞자리가 0인 숫자는 뒤집힌 배열인 makeArr 변수의 [0]이 0일때, shift() 함수로 0이 제거된 배열을 return 하면 될 거 같았는데, 음수일 때 - 를 붙여주는 조건까지 if문으로 우겨넣다보니 코드가 너무 지저분해졌다. 조건중에 하나를 다른 방법으로 줄여주는 과정이 필요할 것 같았다.

2차 풀이

const reverse = x => {
  // 여기에 코드를 작성해주세요.
  const makeArr = String(Math.abs(x)).split('').reverse();
  const makeNum = parseInt(makeArr.join(''));

  if (x < 0) {
    return -makeNum;
  } else {
    return makeNum;
  }   

}

문자열을 숫자로 바꿀 때, parseInt() 함수를 사용하면 shift() 함수를 사용하여 앞자리가 0인 숫자의 0번째 인덱스를 날려주지 않아도 된다! 1차 풀이보다 코드가 훨씬 깔끔해지고 if문도 남발하지 않아 가독성이 좋아진 모습이다.

다른 사람 풀이

(https://habitual-history.tistory.com/entry/CodeKata-2 참고)

const reverse = x => {
  const reverseNum = parseInt(String(x).split('').reverse().join(''));
  return reverseNum * Math.sign(x);
}

더 좋은 코드가 없을까 찾아보던 차에, 한 블로그에서 완전 깔끔하고 보기 좋은 답안을 찾았다. 일단 하나의 변수에 주어진 수를 배열로 바꿔서 뒤집은 다음 다시 숫자로 바꾸는 과정까지 넣으셨고, 음수에 -를 붙이는 과정은 Math.sign()이라는 함수를 곱하는 과정으로 한번에 끝내버리셨다. 세상은 넓고 배울 코드는 많다..

Math.sign()
Math.sign() 함수는 주어진 수의 부호를 나타내는 +/-1을 반환합니다. 단, Math.sign()에 제공한 수가 0일 경우 부호에 따라 +/-0을 반환합니다.

console.log(Math.sign(3));
// expected output: 1
console.log(Math.sign(-3));
// expected output: -1
console.log(Math.sign(0));
// expected output: 0
console.log(Math.sign('-3'));
// expected output: -1

profile
Front-End Developer

0개의 댓글