문제
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 [-231, 231 - 1], then return 0.
Assume the environment does not allow you to store 64-bit integers (signed or unsigned).
Example 1:
Input: x = 123
Output: 321
Example 2:
Input: x = -123
Output: -321
Example 3:
Input: x = 120
Output: 21
정답 코드
< 내 정답 코드 >
class Solution {
public int reverse(int x) {
boolean isSign = false;
String number = String.valueOf(x);
if (String.valueOf(x).charAt(0) == '-') {
isSign = true;
number = number.substring(1);
}
String[] strArray = number.split("");
StringBuilder sb = new StringBuilder();
if (isSign) {
sb.append("-");
}
for (int i = strArray.length - 1; i >= 0; i--) {
sb.append(strArray[i]);
}
try {
return Integer.parseInt(new String(sb));
} catch (NumberFormatException e) {
return 0;
}
}
}
< 타인 답변 코드 >
class Solution {
public int reverse(int x) {
long rev= 0;
while( x != 0){
rev= rev*10 + x % 10;
x= x/10;
if( rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE)
return 0;
}
return (int) rev;
}
}
이것을 주의하자!
- 처음 이 문제를 접하고 프로그래머스에서 비슷한 문제를 풀었던 느낌이 왔다. 뭔가 공식만 있으면 쉽게 풀 것 같은데 그 공식이 생각이 안났다. 할수 없이 생각이 나는대로 코드를 짰다. Int 형으로 받아온 값을 String 으로 바꿔서 String[] 로 변환, 역순으로 다시 배치하도록 설계했다. 이렇게 작성하면서도 "뭔가 비효율적이야.. 다른 방법이 있을텐데" 고개를 저었다. 부호의 경우는 처음에 부호가 있으면 제외하도록 하고 이후 다시 붙이는 방식이다.
- 역시 내 방식대로 실행하니 런타임 관련해서 '최악' 이다.
- 타인의 코드를 보면 정답이 나온다. % 10 을 통해 뒷 자리부터 하나씩 뺀 다음, 이후 * 10을 해 앞자리로 더하도록 하는 방법이다. 이 방안이 교과서처럼 널리 사용되는 듯 하다. 이제 잊지 말자. 숫자의 역순을 구하는 건 공식이 있다!!
- int 형의 크기를 넘는지 아닌지 확인하는 방법으론 Integer.MAX_VALUE ( ) / Integer.MIN_VALUE ( ) 메서드를 이용할 수 있다. 그러면 2,147,483,647 과 - 2,147,483,648 값이 나온다.
'코딩 테스트' 카테고리의 다른 글
[LeetCode] (Easy) Roman to Integer *** (0) | 2022.11.23 |
---|---|
[LeetCode] (Easy) Palindrome Number (0) | 2022.11.23 |
[LeetCode] (Easy) Two Sum ** (0) | 2022.11.23 |
[Hacker Rank] (Easy) Time Conversion (0) | 2022.11.20 |
[Hacker Rank] (Easy) Grading Students (0) | 2022.11.20 |