반응형
https://leetcode.com/problems/reverse-integer/
1. 2022.01.16 시도
소요시간: 10분
class Solution {
public int reverse(int x) {
if (-10 < x && x < 10 ) {
return x;
}
int sign = (x >= 0) ? 1 : 1;
int reversed = 0;
while(x != 0) {
int temp = (reversed * 10) + (x % 10);
if (temp/10 != reversed) {
//범위를 넘어버린 것
return 0;
}
reversed = temp;
x = x/ 10;
}
return sign * reversed;
}
}
풀이 접근 과정
integer palindrome을 구할때 배웠던 나눗셈방법을 사용했다. 공간의 제약이 있는 만큼 그 방법을 그대로 이용해보기로 했다.
integer 범위를 넘는지 체크하는건 임시 변수를 두고 나눗셈을 통해 확인했다.
느낀점
- 하면서 하나 발견한게 Math.abs를 처음에 썼는데 -2147483648에 대해서는 제대로 동작을 하지 않았다. 이건 의외였다. 내부적으로 살펴보니 overflow가 있었다. MIN_VALUE(2^31)에 -를 부여하면 이는 MAX_VALUE(2^31-1) + 1이 되고 overflow가 되어서 다시 MIN_VALUE가 되는 것이다. stackoverflow에서 확인했다.
- 이번 풀이는 2가지 포인트가 있다. 하나는 뒤집는 방법을 알고 있는가이고 두번째는 overflow를 어떻게 체크할 것인가이다.
- 위의 풀이에서는 일의자리와 부호를 분리해서 생각했는데 구지 그렇게 하지 않아도 된다. 왜냐면 맨 앞자리를 할때 부호가 같이 포함되기 때문이다. 간단하게 고치면 아래와 같다. 솔루션은 Integer.MIN_VALUE, Integer.MAX_VALUE를 사용했는데 나는 내 방식이 더 재밌다.
- ex) -123 => 3 => 2 => -1
class Solution {
public int reverse(int x) {
int reversed = 0;
while(x != 0) {
int temp = (reversed * 10) + (x % 10);
if (temp/10 != reversed) {
return 0;
}
reversed = temp;
x = x/ 10;
}
return reversed;
}
}
알고리즘 정리노트: .leetcode(알고리즘 문제풀이 접근)
반응형
'알고리즘 풀이' 카테고리의 다른 글
.leetcode(704. Binary Search) (0) | 2022.01.17 |
---|---|
.leetcode(112. Path Sum) (0) | 2022.01.16 |
.leetcode(9. Palindrome Number) (0) | 2022.01.10 |
.leetcode(226. Invert Binary Tree) (0) | 2022.01.09 |
.leetcode(617. Merge Two Binary Trees) (0) | 2022.01.09 |