문제를 해석하면 다음과 같습니다.
32-bit의 정수가 부호와 함께 주어집니다.
토막지식으로 32비트에서 표현될 수 있는 수는 -2,147,483,647 ~ 2,147,483,647 이에요
이 정수를 뒤집은 형태의 정수로 리턴해주는데 만약에 x를 뒤집은 결과가 32bit로 표현할 수 없다면 0을 return해라~
라는 문제네요
만약 x = 2000000003 이상인 경우에는 x를 뒤집어버리면 32비트를 초과할것입니다.
저 32bit 이상을 표현할 수 없다면에서 예전에 강의를 들으면서 봤던
Number.MAX_VALUE가 떠올라서 이걸 활용할 수 있지않나?? 하면서
설레는 마음으로 MDN에 들어가보니..
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_VALUE
MAX_VALUE는 64비트의 수까지 표현가능한 프로퍼티였습니다.
그래서 혹시 32비트의 수를 표현해주는 프로퍼티가 있나?? 했는데
제 서칭능력으로는 찾을 수 없어서 패스..하고 문제를 풀었습니다.
나의 풀이
var reverse = function(x) {
let reverseabs = Number(Math.abs(x).toString().split('').reverse().join(''))
if(reverseabs > 2147483647) {
return 0
}
return x < 0 ? - + reverseabs : reverseabs
};
문제를 풀면서 어렴풋이 예상하던 형변환이 실제로 어떻게 이루어지는지 좀 더 자세히 알 수 있었습니다.
제 예상과는 조금 다르게 동작하더라고요
발상은 간단합니다.
Math.abs()는 정수의 절댓값을 구해줍니다. 후에 문자열로 형변환을 해주고 split()을 걸어줄것인데
-부호가 있으면 방해되니까 -부호를 없애줬습니다.
그다음 문자열로 바꿔주고 split으로 배열화해준뒤 배열을 뒤집고 다시 합쳐줍니다.
이때 당연하게도 join으로 합쳐진 상태에서는 문자열입니다.
다시 위로 올라가서 테스트케이스 3번을 보면
x = 120인 경우 return 값은 21이 되어야합니다.
하지만 현재 join으로 합쳐진 시점에서의 값은 '021' 이네요
안될것같지만 혹시나 싶어서 Number()를 걸어줘봤는데 앞자리에 0들은 버려지면서 숫자로 바뀌길래
조금 신기했습니다.
혹시 사칙연산자로도 앞자리 0이 버려질지 궁금해서 해봤는데 사칙연산자로도 Number()와 똑같이 동작하네요
그럼 코드를 더 줄여서 사용했을 땐
var reverse = function(x) {
let reverseabs = Math.abs(x).toString().split('').reverse().join('')
if(reverseabs > 2147483647) {
return 0
}
return x < 0 ? -reverseabs : +reverseabs
};
이렇게까지 줄일 수 있을 것 같습니다.
근데 이유는 잘 모르겠지만 이 코드로 시험해보면 이전코드보다 더 많이 메모리를 사용하네요..
// 조금 더 찾아보니 Number()는 64비트의 수까지 처리할 수 있어서
값을 뒤집었을때 32비트를 초과해도 문제없이 처리가 되었던 것 같아요
그럼 뒤집으면 64비트를 초과하는 수를 처리할땐 어떻게 해야될지 궁금하네요
다른 사람의 풀이
function reverse(x) {
const isNegative = x < 0;
x = Math.abs(x);
let ret = 0;
while (x > 0) {
const num = x % 10;
x = Math.floor(x / 10);
ret *= 10;
ret += num;
}
if (ret > Math.pow(2,31)) return 0;
return isNegative ? ret * -1 : ret;
};
Math.pow(2,31)로 32비트를 표현한게 재밌어서 가져와봤습니다.
'leetcode' 카테고리의 다른 글
46. Permutation (0) | 2022.11.18 |
---|---|
448. Find All Numbers Disappeared in an Array (0) | 2022.11.17 |
39. Combination Sum javascript leetcode (0) | 2022.11.16 |
1365. How Many Numbers Are Smaller Than the Current Number javascript leetcode (0) | 2022.11.15 |
1678. Goal Parser Interpretation leetcode javascript (0) | 2022.11.14 |