1 minute read

1.기본로직

  • 끝 자리 숫자를 하나씩 꺼내온다(%10).
  • 중간까지 꺼낸다(while(originNumber > revertedNumber)).
  • 비교 값이 같을 경우 Palindrome(originNumber==revertedNumber   originNumber==(revertedNumber/10))

2.주요원리

  • originNumber%10 은 해당 시점의 끝자리 수를 나타낸다, (%10 은 10을 나눈 나머지, 즉 마지막 자릿수를 의미)
  • revertedNumber10 은 넘겨받은 자릿수를 한 자리씩 앞으로 옮긴다.(10을 할수록 10의 자리씩 앞으로 옮겨진다.)
  • 그러므로 revertedNumber10+originNumber 앞서 넘겨받은 앞자릿수(앞서 뒷자리가 된 수)를 앞으로 옮긴 후 다음 수를 더하는 수순이 된다.(10은 앞 자리로 옮기는 역활)
  • while(originNumber > revertedNumber) 을 반복함으로써, originNumber의 중간 위치까지만 값을 추출한다(Palindrome 비교를 위해선 중간 위치까지만 비교하면 된다.) ex1) 1221 -> 21 까지 추출 후 값 비교 (originNumber==revertedNumber) ex2) 12321 -> 가운데 3은 중앙값이므로 비교 불필요, 21까지 추출 후 앞의 12랑 비교 (originNumber==(revertedNumber/10)
  1. Basic Logic
    • Get a last number at each steps. (%10)
    • Get numbers until midle position.
    • If comparaing numbers are same, it’s palindrome.
  2. Main principle
    • originNumber%10 is return last position number at each time.
    • revertedNumber*10 is make the number(x%10) move to forward at each step. (Every *10 return by the tenth digit forward)
    • Do “while(originNumber > revertedNumber)” loutine, get numbers until originNumber’s middle postion. (Only need to comapre until middle postion for checking palindrome) ex1) 1221 -> Get and compare until number 21 (originNumber==revertedNumber) ex2) 12321 -> 3 is middle numbeer, so we don’t have to extract it. Until get number 21, compare with 12 which located in forward position (originNumber==(revertedNumber/10)

3.Source Code

class Solution {
    fun isPalindrome(x: Int): Boolean {
        //Minus number is not palindrome
        //Also %10==0 and x=!0 is not palindrome (ex: 10, 450)
        if(x<0 || (x%10==0 && x!=0)) return false;
        
        var revertedNumber:Int = 0;
        var originNumber:Int = x;
        //keep deviding x by 10
        //until x will be less than or same with revertedNumber
        //(Compare half digits)
        
        while(originNumber > revertedNumber){    
            //every each step, end of number move to forward
            revertedNumber = revertedNumber*10 + originNumber%10;
            //target number forward
            originNumber/=10; 
        }
        //compare between revertedNumber and x 
        //case 1. originNumber==revertedNumber
        // : ex) 1221 
        //when originNumber=12, revertedNumber =12(last 21 reverted) 
        //-> originNumber==revertedNumber
        //case 2. originNumber==(revertedNumber/10)
        // : ex) 12321
        //when originNumber=12, revertedNumber=123(last 321 reverted)
        //-> originNumber==revertedNumber (middle number 3 is not matter)
        return originNumber==revertedNumber||originNumber==(revertedNumber/10);
    }
}