본문 바로가기

❓ 문제

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

개발의 각궁

Spring | Spring MVC | Spring Boot | Spring Security | Mysql | Oracle | PostgreSQL | Mybatis | JPA | Angular.js | Vue.js | Nuxt.js | React.js | TypeScript | JSP | Frontend | Backend