문제
reverse 함수에 정수인 숫자를 인자로 받습니다. 그 숫자를 뒤집어서 return해주세요.
x: 숫자 return: 뒤집어진 숫자를 반환!
예들 들어, x: 1234 return: 4321
x: -1234 return: -4321
x: 1230 return: 321
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문으로 우겨넣다보니 코드가 너무 지저분해졌다. 조건중에 하나를 다른 방법으로 줄여주는 과정이 필요할 것 같았다.
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