📙 1. 문제
Link : https://leetcode.com/problems/reverse-integer/description/
문제 설명
Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-231, 231 - 1], then return 0.
Assume the environment does not allow you to store 64-bit integers (signed or unsigned).
제한 사항
- 2 ≤ weights의 길이 ≤ 100,000
- 100 ≤ weights[i] ≤ 1,000
풀이 1
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let answer;
if(x<0){
answer= '-'+((-1)*x+'').split('').reverse().join('')
}else{
answer= (x+'').split('').reverse().join('')
}
if(answer> 2**31 -1 || answer< (-1)*2**31){
return 0
}else{
return answer
}
};
풀이 2 : 풀이 1에서 삼항 연산자 1개 추가
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let answer;
if(x<0){
answer= '-'+((-1)*x+'').split('').reverse().join('')
}else{
answer= (x+'').split('').reverse().join('')
}
return (answer> 2**31 -1 || answer< (-1)*2**31)? 0:answer
};
- return할 때 범위를 초과하냐, 안하냐에 따라 0 혹은 answer를 return하도록 하니 소요 시간이 줄고, 소요 메모리가 늘었다.
풀이 3 : 풀이 1에서 삼항 연산자 2개 추가
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
const answer = x<0? '-'+((-1)*x+'').split('').reverse().join(''):(x+'').split('').reverse().join('')
return (answer> 2**31 -1 || answer< (-1)*2**31)? 0:answer
};
- 내친 김에 answer도 삼항연산자로 구현했더니 소요 시간이 상당히 늘었다. 왜인지는 모르겠다.
- chatGPT의견을 물어보니, 시간 복잡도는 거의 동일하고 선언과 동시에 초기화 한 풀이 3이 더 가독성이 높은 코드라고 한다.
풀이 4: Pop과 Push
- 맞아, 스택은 LIFO구조이다. reverse()와 비슷한 원리이다. LIFO구조는 늦게 들어간 것이 먼저 나오고, reverse() 또한 뒤에 있는 문자가 앞으로 온다.
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
const st = [];
let answer = '';
stringX=''+Math.abs(x)
for(let i of stringX){
st.push(i);
}
while(st.length>0){
answer+=st.pop();
}
if(answer>2**31 || answer<(-1)*2**31)return 0
return x < 0?'-'+answer:answer;
};
- 그래서 stack을 이용해서 구현해보았으나, 코드가 오히려 더 복잡해졌다. JS에는 reverse()라는 막강한 메소드가 있어서 그건 못이기나 보다.
🤔 2. 느낀 점
- 처음에는 문제에서 32-bit? 64-bit? signed?해서 뭔가 싶었다. 어려운 용어를 사용한 문제와 달리, 풀어보니 정말 쉬운 문제였다. 풀고나서도 '이게 맞다고?'라는 생각이 들었다.
- signed는 '부호가 있는'을 의미한다. 그리고, 32bit 정수라고 하는데 그 수를 다르게 변형하는 게 아니고 뒤집기만 하면 되기에 reverse()가 기본 메소드로 제공되는 JS로 풀기에 수월했다.
🤩 3. 한 번 더 짚고 갈 점
- Math.abs() : 절대값, Math.sign() : 부호
- 문제가 겉보기에는 어려워 보여도, 잘 해석만 하면 상당히 쉬운 문제가 될 수 있다는 것을 느꼈다.
'코딩 테스트 > LeetCode' 카테고리의 다른 글
[4월 15일] container-with-most-water (1) | 2023.04.15 |
---|---|
[4월 14일] Palindrome Number (0) | 2023.04.14 |
[4월 14일] String to Integer (0) | 2023.04.14 |
[4월 7일] Longest Palindromic Substring (Bruth Force) (0) | 2023.04.07 |
[4월 6일] Longest Substring Without Repeating Characters (0) | 2023.04.06 |
[4월 6일] Add Two Numbers (0) | 2023.04.06 |
[4월 2일] Two Sum (0) | 2023.04.02 |