❓ 문제
Given an integer x
, return true if x
is palindrome integer.
An integer is a palindrome when it reads the same backward as forward.
For example, 121 is a palindrome while 123 is not.
주어진 정수형 x
가 회문(역순으로 읽어도 같은 말이나 구절 또는 숫자)이면 true를 반환하세요.
예를 들어, 121은 회문이고, 123은 회문이 아닌 것입니다.
Example 1
Input: x = 121
Output: true
Explanation: 121 reads as 121 from left to right and from right to left.
Example 2
Input: x = -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
Example 3
Input: x = 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.
Constraints
-231 <= x <= 231 - 1
❗ 내 답변
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
const arr = [];
if (x < 0)
return false;
do {
arr.push(x % 10);
x = parseInt(x / 10);
} while (x / 10 !== 0)
for (let i = 0; i < arr.length; i++) {
if (arr[i] !== arr[arr.length - 1 - i])
return false;
}
return true;
};
Runtime: 210 ms
Memory Usage: 51.4 MB
주어진 정수형을 자리별로 배열에 담고,
반복문을 돌면서 앞자리와 끝자리를 비교하게 했다.
음수는 무조건 회문이 될 수 없기 때문에 if
문으로 걸러줬다.
❗ Runtime이 가장 빨랐던 답변과 비교
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
const str = x.toString()
for (let i=0; i<Math.ceil(str.length/2); i++){
if (str[i]!==str[str.length-1-i]){
return false
}
}
return true
// const str=x.toString()
// let revStr = ''
// for (let i=0; i<str.length; i++){
// revStr = str[i] + revStr
// }
// if (revStr === str){
// return true
// } else {
// return false
// }
};
Runtime: 363 ms
Memory Usage: 50.6 MB
나는 정수형 그대로 사용했지만, 이 답변은 주어진 정수를 문자열로 변환했다.
변환한 문자열은 배열처럼 자리를 찾을 수 있다.
때문에 if
문으로 자리를 비교하는 부분은 나랑 같았다.
다른 점은 for
문이었는데,
이 답변에선 주어진 문자열의 절반만 반복해
str.length 를 2로 나누고, 나눈 숫자의 소수점을 없애기 위해 Mail.ceil
을 사용했다.
Math.ceil
소수점 이하를 올림하는 메소드.
Math.ceil(.95); // 1
Math.ceil(4); // 4
Math.ceil(7.004); // 8
Math.ceil(-0.95); // -0
Math.ceil(-4); // -4
Math.ceil(-7.004); // -7
이 답변 처럼 나도 정수 배열 전체를 반복 돌지 말고,
반만 반복하여 불필요한 반복을 줄일 수 있었지 않을까 하는 생각이 든다.
(수정해서 실행 시켜보았을 때, RunTime 에선 크게 차이가 없었다.)
❗ Memory 사용이 가장 적었던 답변과 비교
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
const str = x + '';
const length = str.length / 2;
for (let i = 0; i < length; i++) {
if (str[i] !== str[str.length - i - 1]) {
return false;
}
}
return true;
};
Runtime: 259 ms
Memory Usage: 51.1 MB
이 답변 역시 위 RunTime이 가장 빨랐던 답변과 같이
주어진 정수형을 문자열로 변경하고, 반만 반복 돌아 비교를 했다.
💡 개선 방안
반복 돌면서 배열에 나눠 담는 것 보단, 단순히 정수를 문자열로 변경하고
전체를 반복 돌지말고 반만 반복 돌아 불필요한 반복을 줄이자!
'알고리즘 > leetCode' 카테고리의 다른 글
[leetCode] 21. Merge Two Sorted Lists (Easy) 풀이 (0) | 2022.05.09 |
---|---|
[leetCode] 20. Valid Parentheses (Easy) 풀이 (0) | 2022.03.08 |
[leetCode] 14. Longest Common Prefix (Easy) 풀이 (0) | 2022.03.07 |
[leetCode] 13. Roman to Integer (Easy) 풀이 (0) | 2022.03.04 |
[leetCode] 1. Two Sum (Easy) 풀이 (0) | 2022.02.25 |