본문 바로가기

❓ 문제

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이 가장 빨랐던 답변과 같이
주어진 정수형을 문자열로 변경하고, 반만 반복 돌아 비교를 했다.

💡 개선 방안

반복 돌면서 배열에 나눠 담는 것 보단, 단순히 정수를 문자열로 변경하고
전체를 반복 돌지말고 반만 반복 돌아 불필요한 반복을 줄이자!

Seize the day!

Spring MVC | Spring Boot | Spring Security | Mysql | Oracle | PostgreSQL | Vue.js | Nuxt.js | React.js | TypeScript | JSP | Frontend | Backend | Full Stack | 자기계발 | 미라클 모닝 | 일상