Code Kata #4 Same Reverse

kich555·2021년 9월 19일
0

Code Kata

목록 보기
4/7

💻Same Reverse

숫자인 num을 인자로 넘겨주면, 뒤집은 모양이 num과 똑같은지 여부를 반환해주세요.

예를 들어,
num = 123 return false => 뒤집은 모양이 321 이기 때문

num = 1221 return true => 뒤집은 모양이 1221 이기 때문

num = -121 return false => 뒤집은 모양이 121- 이기 때문

num = 10 return false => 뒤집은 모양이 01 이기 때문

☕첫번째 풀이

const sameReverse = num => {
  let reverseNum = parseInt(num.toString().split('').reverse().join('')) // 받은 인자를 거꾸로 돌린 문자열 생성
  if(num == reverseNum){ // 정수와 문자열을 비교하는 것이기 때문에 타입까지 비교하는 === 사용 X
    return true
  }else{return false}
}

요 전에 한 문제와 매우 흡사하기 때문에 후다닥 풀었다.

💻리팩토링

const sameReverse = num => {
  let reverseNum = parseInt(num.toString().split('').reverse().join(''))
  let anwser = reverseNum == num ? true : false // 삼항연산자로 코드 줄이기 + 문자열 정수 비교기 때문에 == 사용
  return anwser
  }

빠른 리팩토링. 리엑트를 배우는데 슬금슬금 쓰고있는 삼항 연산자를 사용하였다.

시간 내 문제는 풀었으니 바로 형변환을 최소한으로 해보자.

💡두번째 풀이

const sameReverse = num => {
  let str = num+""
  for(i in str){
    if(str[i] == str[str.length-i-1]){
      continue;
    }return false
  }return true

}

-의 존재때문에 정수 타입만 사용해서는 완벽하게 수를 반전할 수 없다.
정수에서는 -1441 -> 1441-가 되지 않기때문
그래서 일단 문자열로까지의 형 변환을 하기로 했다.

 let str = num+""

정수를 문자열로 타입변환하는데 재밌는 방법이 있길래 따라해봤다. (JS는 뭐든지 된다구!)

for(i in str){
   if(str[i] == str[str.length-i-1]){ 
     continue;
   }return false
 }return true

문자열의 첫번째 문자와 마지막 문자를 비교하는 조건반복문을 작성하였다. ex) '123456'-> 16 / 25 / 34 비교
문제는 조건문을 사용하면 무조건 if문의 { }박스 안에 식을 넣어야 한다는 것이었다.
우리는 단순히 조건 비교만 원할 뿐이고 식은 필요하지 않았다.
고민하던 중 찾은 답은 continue였다.

continue JavaScript|MDN
break 문과 달리 continue는 루프의 실행을 완전히 종료하지 않고 for, while문에서 다음과 같이 동작합니다.

  • while 루프에서는 다시 조건으로 점프합니다.
  • for 루프에서는 업데이트 표현식으로 점프합니다.
// for(i in str){
//    if(str[i] == str[str.length-i-1]){ 
//      continue;
//    }return false
  }return true

continue를 사용한다면 조건문은 돌되, 다 돌고난 후 업데이트 표현식으로 점프한다.
결국 for문과 if문이 끝난 시점으로 점프하여 return true를 실행한다.

💻리팩토링

const sameReverse = num => {
 let str = num+"";
 for(i=0; i<str.length/2; i++){
   if(str[i] == str[str.length-i-1]){
     continue;
   }return false;
 }return true;
};

만약 인자로 받은 정수가 뒤집어도 같다면 ex)1221, 44244, 굳이 정수의 길이만큼 반복문을 돌릴 필요가 있을까? 라는 생각이 들었다.

  for(i=0; i<str.length/2; i++){ // 문자열 길이의 반까지만 반복문을 실행 /

☕굳이 의미없는 계산을 하지 않는다면 성능이 좀 더 올라가지 않을까?

🔥3번째 풀이

const sameReverse = num => {
 let r = 0;
 let q = 0;
 let a = num;
while(a){
   r = a%10;
   q = (q*10) + r;
   a = parseInt(a/10);
 }
let answer =  num === q && num>0? true : false;
return answer;
};
Code Kata를 할 수록 JS기본을 공부 했던 것이 도움이 많이 된다고 생각한다.

🔥생각해보니 내가 멍청했다. 애초에 음수일 경우에 false가 출력되게끔 한다면, 이 식은 정수타입만으로 해결할 수 있다.🔥

이전 정수를 반전할때와 같은 식을 활용하였다.
달라진 부분이라면,

 let a = num // 인자로 받는 num값을 while문에 넣어 돌린다면 num값 자체가 바뀌게 된다. 
  while(a){
   r = a%10;
   q = (q*10) + r;
   a = parseInt(a/10);
 }
  1. num의 인자로 받는 값 (편의상 num값)을 while문에 넣어 돌린다면 num값 자체가 바뀌게 된다.
  2. 때문에 num값과 반환되는 값을 비교할 수 없어져버린다.
  3. Primitive type의 데이터는 불변성을 가지는 속성을 이용하여 a라는 변수를 만들고 num값과 같은 메모리 주소를 포인터로 가지게 설정했다. (let a = num)
이러면 a값을 가공하더라도 num값에 영향을 미치지 않는다. 반대로 num값을 가공하더라도, a값에 영향이 가지 않는다.
  1. a를 while문에 넣어 반전된 값을 q에 저장하고, 아무런 가공을 하지 않은 num과 가공된 q를 비교하는 조건문을 사용했다.

💡역시 3번식이 가장 빠른것을 볼 수 있다.💡

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

0개의 댓글