[LEETCODE] Reverse Integer - float 과 int의 비교
https://leetcode.com/problems/reverse-integer/
Reverse Integer - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
입력받은 숫자를 거꾸로 뒤집는 프로그래밍을 공부하는 사람이라면 한번쯤은 거쳐가는 문제.
풀이 자체는 어렵지 않지만 문제 푸는 과정에서 복습한 사실, 새로 알게된 사실을 정리해보려고 한다.
x는 입력받은 수, result를 뒤집은 수라고 할 때,
result에 10을 곱하고 x%10 를 더해주는 일반적인 방식으로 풀었다.
뒤집은 수가 int 범위를 넘어가면 0을 출력해야 하기 때문에 조건문을 먼저 검사하게 했는데,
정말 오랜만에 푸는 문제라 처음에는 result * 10 과 INT_MAX를 비교해서 result가 충분히 큰 수일때
result * 10 이 int 범위를 넘어가 오버플로우가 일어나는 문제가 있었다.
그래서 또 아무 생각없이 int를 넘어가니까 float에 저장하게 하자~ 해서 조건문에서 result를 float로 형변환을 해서 나온 게 아래의 코드이다.
int reverse(int x){
int result = 0;
while(x!=0){
if((float)result * 10 > INT_MAX || (float)result * 10 < INT_MIN)
return 0;
if(((float)result*10==INT_MAX && x/10 >7)&&((float)result*10==INT_MIN && x/10 < -8))
return 0;
result *= 10;
result += (x%10);
x = x / 10;
}
return result;
}
역시나 오류가 난다.
코드를 가져올때 윗부분을 조금 잘라내서 줄 수가 다른데, 에러메세지의 Line 11은 result *= 10; 을 말한다.
일단, 두번째 조건문에서, float과 int형은 ==으로 비교할 수 없다. 이거는 이후에 고쳐주었다.
위 사진의 오류는 첫번째 조건문에서 제대로 걸러지지 않아 생긴 문제이다.
내가 원하는 대로라면, input이 1563847412이므로 while문을 돌면서 r = 214748365 까지 간 뒤에 , r*10을 하면
2147483650으로 INT_MAX값을 넘기때문에 첫번째 조건문에 걸려 0이 return되고 끝이 나야 한다.
왜 (float)214748365 * 10 > INT_MAX 가 True가 나오지 않았을까?
그 이유는 역시 스택오버플로우에서 찾았다.
https://stackoverflow.com/questions/526070/handling-overflow-when-casting-doubles-to-integers-in-c
Handling overflow when casting doubles to integers in C
Today, I noticed that when I cast a double that is greater than the maximum possible integer to an integer, I get -2147483648. Similarly, when I cast a double that is less than the minimum possible
stackoverflow.com
적당히 뽑아왔는데 들어가서 전부 읽어보면 좋을것이다.
int와 float 비교를 위해 INT_MAX를 float으로 캐스팅한다거나 할수도 있지만,
사실 정말 간단한 해결책이 있는데 이걸 처음부터 생각을 못했다.
result*10 을 INT_MAX와 비교할게 아니라 result를 INT_MAX / 10과 비교하는것
쓸데없는 형변환 없이 깔끔해졌다.
int reverse(int x){
int result = 0;
while(x!=0){
if(result > INT_MAX / 10 || result < INT_MIN / 10){
return 0;
}
if((result==INT_MAX/10 && x/10 >7)||(result==INT_MIN /10 && x/10 < -8))
return 0;
result *= 10;
result += (x%10);
x = x / 10;
}
return result;
}