LeetCode 7. Reverse Integer

sally·2022년 1월 12일
0

알고리즘

목록 보기
4/5

Leetcode

문제
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.

intlong
4byte8byte
32bit64bit

숫자타입이 로직 변경의 포인트였다.

  • 첫번째 예시 : 123 → 321 ...stack? 🙃
    • 순서를 바꾼 문자열을 int 형으로 변경하면서 생긴 오류 - Integer 메서드를 쓰면서 int 범위초과
    • 통과 못하더라도 구현 해보자고 생각 했어요 ...🙃
      • int 범위? : -2147483648 ~ 2147483647
        • 10자리 : 11자리는 안 된다.
        • 10번째 2자리 2이상 X, 9번째 자리 1이상 X ... 하나씩 비교는 의미가 없어보였다.
    • 이렇게 일일이 조건은... 안 좋지만, 그래도 고민
      • 이미 범위 초과 숫자를 담은 문자열을 어떻게 판별해서 예외처리 할까?
      • 클라이언트에서 큰 숫자들로 변경되어 들어온다면?
        • unicode도 보고... 했지만 잘 모르겠습니다. (도움주시면 감사👍)
    • 그냥 좋아하나 보다. BigInteger
      • 또 에러.. 테스트 코드에서는 통과 했었지만, LeetCode는 안 되네요.
		if (stack.size() >= 11) {
			return 0;
		}
        
        		/***/

        	String str = actual.toString();
		BigInteger test = new BigInteger(str);
        
        	if (test.compareTo(new BigInteger("-2147483648")) < 0 || test.compareTo(new BigInteger("2147483647")) > 0 ) {
			return 0;
		}

설계

  • 문자열로 처리하면, 이미 커져버린 숫자를 상세히 조사해야 한다.
    • int 범위 안에서 관리 해야 한다.
  • 문자열로 변환시켰던 이유는, 하나씩 분리시키기 위해서였다.
    • int를 어떻게 분리시킬까?
  • 숫자는 변경된다. 커지기 전에 어떻게 catch 할까?

얼굴만 자란다... 🕺🏻 →(어떻게 알지?) → 🙎🏻 → (어떻게 알까?)→ 👩🏻

int 분리

목표%/
3123 % 10 = 3123/10 = 12
212 % 10 = 212/10 = 1
11 % 10 = 11/10 = 0 (종료)

숫자가 int 보다 커지기 전에 알아야 한다. 👩🏻

  • 뒤에서 부터 분리한 숫자를 어떻게 이어 나갈까?
    • 321 = 3백2십1일
    • 3 × 100, 2 × 10, .. +1
      • 0 × 10 + 3 = 3
      • 3 × 10 + 2 = 32
      • 32 × 10 + 1 = 321
  • 큰 수 였다면 : 9억 → 90억
    • 가장 크게 영향을 주는 ×10
    • 가장 큰값/10, 가장 작은값/10 이 되기 전에 반환

  • 최선의 결과는 아니지만, 이해한 대로 구현 합니다.
    • 중간에 애 먹었던 것이 while 문이었다.
    • 표에서 보듯이 0이 종료 조건이다. >, <건 양수,음수로 조건이 되지 못한다.
	@ParameterizedTest
	@MethodSource("providerParam")
	void test2(int x, int expect) {
		int result = 0;
		int digit = x;
		while (x != 0) {  // 양수,음수 고려
			digit = x % 10;
			x /= 10;

			if (result > Integer.MAX_VALUE/10 || result < Integer.MIN_VALUE/10) {
				result = 0;
				break;
			}

			result = result * 10 + digit;

		}
		assertEquals(expect, result);
	}
profile
sally의 법칙을 따르는 bug Duck

0개의 댓글