Code Kata #2 Reverse

kich555·2021년 9월 19일
0

Code Kata

목록 보기
2/7

💻Reverse

reverse 함수에 정수인 숫자를 인자로 받습니다. 그 숫자를 뒤집어서 return해주세요.
예들 들어, x: 1234 return: 4321

x: -1234 return: -4321

x: 1230 return: 321

☕첫번째 풀이

const reverse = x => {
  let str = x.toString()
  const arr = str.split('')
  const newArr = arr.reverse()
  let newStr = newArr.join('')
  return Math.sign(x)*newStr
  //return parseInt(x.toString().split('').reverse().join('')) * Math.sign(x);
}

단순하게 생각했다.
문제의 요구사항은 '정수인 숫자', '뒤집어' 2개 였음으로 숫자를 뒤집을 방법을 찾았다.

머릿속에서 가장 간단한 방법은

 let str = x.toString() // 배열로 변환하기 위해 문자열 변환
 const arr = str.split('') //배열로 변환
 const newArr = arr.reverse() // 배열 메소드 활용하여 거꾸로 뒤집기
  let newStr = newArr.join('') // 뒤집은 배열을 다시 문자열로 합치기
 return Math.sign(x) // javascipt가 동적 타입 언어인 것을 활용하여 그냥 문자열에 정수 곱해버리기

였다.

빠르게 문제를 해결한 후 변수 너무 많았음으로 리팩토링을 진행하기로 하였다.

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

리팩토링을 진행하였음에도 아쉬운 점이 많았는데 그 이유는 너무나 많은 형 변환이었다.

정수->문자열->배열->문자열->정수....

이는 분명 코드의 성능을 떨어트리는 요인이 될것이라고 판단. 다른 방법을 고민해보기로 하였다.

💡두번째 풀이

const reverse = x => {
  let r = 0
  let q = 0
  
 while(x){
    r = x%10
    q = (q*10) + r
    x = parseInt(x/10)
  }return q
}

정수를 인자로 받았으니 정수만으로 해결해보고 싶었다.

const reverse = x => {
  let r = 0 // 나머지를 담을 빈 정수 r을 생성
  let q = 0 // 답을 담을 빈 정수 q를 생성
  
 while(x){
    r = x%10 // 인자로 받은 x를 10으로 나눈 후 나머지를 r에 저장 (1의 자리 수 확보)
    q = (q*10) + r // 반복문이 돌며 수가 계속 채워져야 함으로 확보한 나머지에 10을 곱하여 10의 자리로 보낸 후 새로운 나머지를 더하기
    x = parseInt(x/10) // 이 식은 x의 몫이 0이 될때까지 진행
  }return q
}💡

인자인 x가 정수기 때문에 나머지와 몫을 활용해야겠다는 생각은 빠르게 떠올랐다.
하지만 언제까지 실행할 것인가? 에 대한 부분에서 막혀벼렸다.

평상시 for문을 돌릴때는 i값, 주로 배열의 반복문을 돌릴때가 많다보니,
순수한 정수를 반복문에 활용한다 라는 개념이 머릿속에 잘 들어오지 않았다.

이 부분에 대해 고민하던 중 정말 처음 JS를 배울 때 사용하던 while문이 떠올랐다.
while문을 사용하면 얼마만큼 반복해야 할 지 몰라도 반복문을 돌릴 수 있었다.

 x = x/10 // 처음엔 단순히 x값을 계속 10으로 나누면 되겠지 했는데, 0으로 딱 떨어지지 않아서그런지 infinity가 출력이 되었다.
 x = parseInt(x/10) // parseInt를 사용하여 0근사치는 0으로 출력되게 만들어 주었다. 

profile
const isInChallenge = true; const hasStrongWill = true; (() => { while (isInChallenge) { if(hasStrongWill) {return 'Success' } })();

0개의 댓글