❓ 문제
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가 주어졌을 때, 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.
❗ 내 풀이
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
let charNum = (x).toString();
let len = charNum.length;
let arr = [];
let verArr = [];
for(let i = 0; i < len ; i++) {
arr.push(charNum.substring(i, i+1));
}
verArr = Object.assign([],arr).reverse();
for(let i = 0; i < arr.length ; i++) {
if(arr[i] !== verArr[i]) {
return false;
}
}
return true;
};
Runtime: 268 ms
Memory Usage: 51.5MB
알게 된 점
1. JS - reverse함수
reverse함수를 사용하여 배열의 값을 거꾸로 한 배열을 만들고자 하였다.
verArr = arr.reverse();
reverse() 함수를 사용하게 되면 'arr.reverse();'만 사용하여도 해당 arr에 거꾸로 된 값이 들어가게 된다.
그러므로 위 코드를 실행하면 arr배열의 값을 뒤집은 배열이 arr와 verArr에도 들어가게 된다.
이를 해결하기 위해 arr배열의 값을 복사하여 뒤집었다.
verArr = Object.assign([],arr).reverse();
2. forEach, Map은 중간에 return이 불가능하다.
처음에 코드를 for문이 아닌 forEach문으로 개발한 뒤 return을 시켜주었다.
arr.forEach((item, index) => {
if(item !== verArr[index]) {
return false;
}
});
return true;
output이 false가 나와야 함에도 불구하고 true가 나오는 것이 아닌가..! 알고 보니 forEach문과 Map은 전부 끝까지 돌기에 return이 불가능한 것이었다. return이 가능한 for문을 사용하였다.
❗ 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;
};
나는 해당 문자열을 잘라서(substring) 배열에 넣은 후 해당 배열을 뒤집은 배열과 비교하여 개발하였지만, 바로 문자열을 배열처럼 사용하여 개발하였다.
그리고 모두 도는 것이 아니라 Math.ceil()함수를 사용하여 반틈만 돌아서 해당 값들을 비교하였다.
1. 문자열을 배열처럼 사용할 수 있다.
2. 배열을 반틈만 비교하기.
❗ Memory 사용이 가장 적었던 답변과 비교
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if(x < 0) return false;
let array = [];
let calc = x;
while(calc) {
array.push(calc % 10);
calc = (calc - (calc % 10)) / 10;
};
return x == array.reduce((s,t) => (s * 10) + t, 0)
};
x가 음수이면 '-'가 붙으니 무조건 회문이 아니므로 return false;을 해주었다. 이런 생각이나 센스를 키우자.
x가 음수이면 false로 리턴하기
❗ 또 다른 답변과 비교
var isPalindrome = function(x) {
let reversedNumber = parseInt(x.toString().split('').reverse().join(''));
return ( x == reversedNumber);
};
1. x를 문자로 만든다. => x.toString()
2. x를 배열로 만든다. => split('')
3. 해당 배열을 뒤집는다. => reverse()
4. 뒤집은 배열을 합친다. => join('')
5. 합친 배열을 정수로 만든다. => parseInt()
문자열을 배열로 만들게 될 경우, substring이 아닌 split('')으로 배열을 만들자.
💡 개선방안 적용 후 내 풀이
1. x가 음수일 경우 false로 리턴하기
2. 정수를 문자열로 반한 것을 다시 배열로 바뀌지 않기
3. for문을 돌 때, Math.ceil을 사용하여 반틈만 돌기
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if(x < 0) {
return false;
}
let charNum = x.toString();
let charLen = charNum.length;
for(let i = 0; i < Math.ceil(charLen/2) ; i++) {
if(charNum[i] !== charNum[charLen - 1 - i]) {
return false;
}
}
return true;
};
Runtime: 168 ms
Memory Usage: 50.5 MB
🚩 Detail
- 날짜 : 2022.03.11
- 난이도 : Easy
- 제목 : Palindrome Number
- URL : https://leetcode.com/problems/palindrome-number/
'알고리즘 > 문제풀이' 카테고리의 다른 글
[LeetCode] 14. Longest Common Prefix (Easy) 풀이 (1) | 2022.03.16 |
---|---|
[LeetCode] 13. Roman to Integer (Easy) 풀이 (0) | 2022.03.14 |
[LeetCode] 1. Two Sum (Easy) 풀이 (1) | 2022.03.11 |
[프로그래머스] 코딩테스트 연습 - 평균 구하기 Java, JavaScript (1) | 2021.08.25 |
[프로그래머스] 위클리챌린지 1주차 - 부족한 금액 계산하기 Java (0) | 2021.08.24 |