본문 바로가기

Programming/알고리즘 공부

[LeetCode] Reverse Integer | 난이도: Easy

반응형

문제

Given a signed 32-bit integer x, return x with its digits reversed.

If reversing x causes the value to go outside the signed 32-bit integer range [−2³¹, 2³¹ − 1], then return 0.

 

주어진 32비트 정수 x값이 있다. 정수 x 자릿수를 역으로 바꾸어라.만약 역으로 바꾼 정수의 값의 범위가 −2³¹, 2³¹ − 1를 넘어갔을 경우, 0을 반환한다.


예시

Input: x = 123
Output: 321

말 그대로 숫자를 반대로 뒤집는 것.


답안

class Solution {
    public int reverse(int x) { 
        long res = 0;
        while(x != 0){
            res *= 10;
            res += x % 10;
            x /= 10;
        }
        return (int)res == res ? (int)res : 0;      
    }
}

32비트에서 Int 정수 범위는 -2,147,483,648(−2³¹) ~ 2,147,483,647(2³¹ − 1) 이다.

문제에서 오버플로우가 발생하지 않도록 32비트 정수 범위 내에서 로직을 만들고,

범위에서 벗어난 경우 정수 0을 반환할 것을 요구했다.

 

조건값이 0보다 큰 경우 while문을 반복하도록 설정.

 

res *= 10 : 자릿수(1의 자리, 10의 자리..)를 증가시키기 위한 계산식.

res += x % 10 : 맨 마지막 숫자를 구한다. 

x /= 10 : 이전 계산식에서 맨 마지막 숫자를 가져와서 res 변수에 담았으니 res 변수에 담긴 마지막 숫자를 잘라낸다.

               int형 타입은 딱 정수만을 나타내기 때문에 소수점 제외한 값만 가져온다.

 

사용된 계신식을 글로 이해하려고 하니 괜히 어렵게 느껴진다. 본인이 써놓고도 긴가민가하다.

간단한 예시로 더욱 쉽게 알아보자.


주어진 int x의 값이 '123'이라고 가정하자. 그렇다면 x값을 반대로 뒤집은 '321'을 출력해야 한다.

뒤집은 값을 저장할 변수 res를 선언한다.

 

Step.1) res *= 10(자릿수 구하기)

- long 타입 변수 res의 값을 0으로 설정했다. 결과는 0.

- res = 0, x = 123

 

Step.2) res += x % 10(맨 마지막 숫자 구하기)

- 주어진 값을 역순으로 바꾸려면 맨 마지막 숫자를 구해야 한다.

- x의 값 123을 10으로 나눈 나머지 값을 반환하여 res 값을 더한다. 결과는 3.

- res = 3, x = 123

 

Step.3) x /= 10(마지막 숫자 자르기)

- x 값을 10으로 나눈다. 결과는 12

- res = 3, x = 12

 

while문 첫 번째 순환 결과 res = 3, x = 12.

while문 두 번째 순환 결과 res = 32, x = 1.

while문 세 번째 순환 결과 res = 321, x = 0.

 

뒤집힌 값이 저장된 변수 res를 리턴한다.


해당 문제에 대한 여러 답안 중 가장 심플한 것을 가져왔다.

문제 풀이법이야 제각각이겠지만, 가장 중요한 것은 문제의 요구사항이 정확히 무엇인지 명확히 이해하는 것이라고 느꼈다.

잘못된 점이 발견되는 틈틈이 수정하겠습니다.

 

반응형