글 작성자: 개발자 올라프

문제

 

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

 

1. 인자로 1234 숫자가 들어왔다면 4321이라는 숫자를 반환해야 한다.

2. 인자로 -1234 숫자가 들어왔다면 -4321이라는 숫자를 반환해야 한다.

3. 인자로 1230 숫자가 들어왔다면 321이라는 숫자를 반환해야 한다.

 

 

풀이

 

짝이랑 진행한 코드

function reverse(nums) {
	let numToString = nums.toString(); // 숫자를 문자열로
    let arr = numToString.split(''); // 문자열을 배열로
    let arrReverse = arr.reverse(); // 배열을 거꾸로
    
    if(arrReverse.includes('-')) {
    	return -parseInt(arrReverse.join(''));
    } else {
    	return parseInt(arrReverse.join(''));
    }
}

 

순서를 반전할 수 있는 메서드가 있는지 찾다가 reverse()를 알게 되었고 배열로 만드는 과정과 다시 숫자로 돌리는 과정을 고민했던 것 같다.

 

Object.prototype.toString() : 문자열을 반환하는 Object의 대표적인 방법

String.prototype.split() : String 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나누어 배열로 반환한다.

Array.prototype.reverse() : 배열의 순서를 반전한 결과를 반환

Array.prototype.includes() : 배열이 특정 요소를 포함하고 있는지 판별하여 true, false 반환

Array.prototype.join() : 배열의 모든 요소를 연결해 하나의 문자열로 만든다.

parseInt() : 문자열 인자를 파싱하여 특정 진수의 정수를 반환

 

리팩토링

const reverse = (nums) => {
	let arrReverse = nums.toString().split('').reverse();
    
    const result = arrReverse.includes('-') 
    	? parseInt(arrReverse.join('')) * -1 
        : parseInt(arrReverse.join(''));
        
    return result;
}

 

메서드를 검색하다가 알게 된 사실

 

 

열심히 만들어낸 결과가 MDN에 똑같이 있었는데 효과적인 방법이 아니라고 적혀있다. 왜냐하면 문자열에 grapheme clusters가 있을 경우, 유니코드 플래그를 설정해도 오류를 일으킨다고 한다. 

 

 

같은 33기분 조언으로 만든 코드

let negative = 1;

const reverse = (nums) => {
  let result = 0;
  
  if (nums < 0) {
    negative = -1
    nums = -nums;
  }
  
  while(nums) {
    result = (nums%10) + (result*10);
    nums = Math.floor(nums/10);
  }
  return negative * result;
}

백엔드 공부를 하고 계신 분에게 조언을 구했는데 몫과 나머지를 이용해서 숫자를 반전시킬 수 있다고 하셔서 작성하게 된 코드이다. 설명을 듣고 머리를 맞은 기분이었는데 이런게 바로 컴퓨팅사고, 알고리즘을 푸는 자세구나 싶었다. 문제를 풀면서 쓸만한 메서드가 없을까 생각만 했던 반면에 이 문제를 수학적으로 접근할 수 있었다는게 놀라웠던 문제였다.