[Leetcode] Palindrome Number

lkimilhol·2021년 2월 3일
0

코딩테스트

목록 보기
1/8

https://leetcode.com/problems/palindrome-number/

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 palindrome while 123 is not.


정수가 주어졌을때 palindrome인지 확인하는 문제입니다.

palindrome이란 역순으로 읽어도 같은 문자를 뜻합니다.

처음 접근을 했을 때 String으로 변환시켜 하는 방법이 제일 먼저 떠오를 텐데요. 보통 코딩 테스트에서 문자열로 변환시키는 방법등은 시간 복잡도등 영향을 줘서 failed로 테스트 결과가 나오는 것들이 기억이 났습니다.

따라서 저는 String으로 변환하지 않고 문제를 푸는것에 집중했습니다.

문제는 다음 플로우를 따라 갑니다.

  • 0보다 작은 음수의 경우에는 false
  • 0부터 10 미만의 숫자는 true
  • 10으로 나누어 떨어지는 경우는 false

문제에서 설명되어 있는 부분들을 처리를 해주고 10으로 나눴을 때 처리를 먼저 해주도록 하였습니다.

주어진 x의 자릿수를 왼쪽에서, 오른쪽에서 나눈 몫을 다시 10으로 나누었고 남은 나머지를 a와 b에 담아서 비교했습니다.

이렇게 되면 가령 i의 몫이 12가 되더라도 비교하려는 숫자를 골라 낼 수 있습니다. (12 중 2를 골라내게 됩니다. 1은 전에 비교했겠죠?)

그리고 나눈 몫이 10 이거나 0 일수 있습니다.
숫자가 10101 같은 경우가 그렇습니다. 그런 경우는 모두 1로 치환하여 비교 하였습니다.

image

결과가 그리 좋은거 같진 않습니다만, 성공하였습니다.

https://github.com/lkimilhol/studyForCodingTest/blob/master/src/com/company/Leetcode/PalindromeNumber.java

public class PalindromeNumber {
    public static boolean isPalindrome(int x) {
        if (x < 0) {
            return false;
        }

        if (x < 10) {
            return true;
        }

        if (x % 10 == 0) {
            return false;
        }

        int len = 0;
        int tmp = x;

        while (tmp != 0) {
            len++;
            tmp /= 10;
        }

        int j = len / 2;

        for (int i = len - 1; i > 0; i--) {
            if (j <= 0) {break;}
            int a = (x / (int)Math.pow(10, i)) % 10;
            int b = (x / (int) Math.pow(10, len - i - 1)) % 10;

            if (a % 10 == 0) {a = 1;}
            if (b == 0) { b = 1;}


            if (a != b) {
                return false;
            }

            j--;
        }

        return true;
    }
}
profile
백엔드 개발자

0개의 댓글