35_알고리즘

2522 단어 알고리즘TILTIL

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

x: 숫자 return: 뒤집어진 숫자를 반환한다.

예들 들어, 
x: 1234 → return: 4321
x: -1234 → return: -4321
x: 1230 → return: 321
  • 논리 전개 방식
    1) 숫자를 뒤집는다.
    2) 인자값 < 0 이면 return 값에 -1을 곱한다.

찾아보니 number타입을 뒤집는 함수는 없었다.
그래서 1) 문자열로 변환
2) 각각의 글자를 배열로 변환
3) 순서 반전
4) 문자열로 재변환
5) 숫자로 변환하는 과정을 거치기로 했다.
참고: https://gocoding.tistory.com/153

const reverse = x => {
  let xString = x.toString();
  let stringSplit = xString.split('');
  let reversString = stringSplit.reverse();
  let joinString = reversString.join('');
  let xNumber = parseInt(joinString, 10);

  if (x > 0) {
    return xReverse;
  } else if(x < 0) {
    return xReverse * -1;
  } else {
    return 0;
  }
}  

팀원인 재현님은 reverse함수를 사용하지 않고 for문을 이용해 순서를 반전시켰다.
나는 만약 reverse함수가 없었다면, for문을 이용할 생각도 못했을 것이다.
그래서 아이디어와 코드를 익히고자 기록으로 남긴다.

const reverse = x => {
  let nums = x.toString();
  let reverseNums = [];
  let index = 0;
  for(let i = nums.length-1; i > 0; i--) {
    reverseNums[index] = nums[i];
    index++;
  }
  // for문을 활용한 순서 반전
 
  let result = reverseNums.join('');
  let numbers = parseInt(result);

  if(x > 0) {
    return numbers;
  } else if (x < 0) {
    return numbers * -1;
  } else {
    return 0;
  }
}

정리를 마치고 끝내려는 순간, 코드를 한 줄로 짠 팀이 있다길래 코드를 받아왔다.

const reverse = x => {
return x > 0 ? (parseInt(x.toString().split("").reverse().join(""))) : (-parseInt(x.toString().split("").reverse().join("")));
}

변수를 하나로 묶은 것까지는 예상했던 부분이라 그러려니 했는데,
삼항연산자에 응용한 것을 보면서 잘 짠 코드는 예술품처럼 아름다울 수도 있겠다는 생각이 들었다.

다만, 가독성면에서 아쉬움이 남았다.
그래서 코드를 리팩토링해봤다.

const reverse = x => {
  let xReverse = parseInt(x.toString().split('').reverse().join(''));
  return  x > 0 ? xReverse : 
  x === 0 ? 0 : xReverse * -1
}

가독성은 높였지만, 한 줄이었을 때의 놀라움은 느껴지지 않았다.
아쉬웠다.

  • 결론
    :: 가독성과 효율성은 상황에 맞춰서 쓰자. 가독성이 중요할 때도 있고, 효율성이 더 중요할 때도 있다.
    :: 코드도 아름다울 수 있다.

좋은 웹페이지 즐겨찾기