CodeUp 1754: 큰 수 비교

soominlee·2022년 8월 5일
0

🧄 Coding Test

목록 보기
1/9

문제

우리는 숫자를 int나 long long으로 처리하였다.
이번엔 그보다 더 큰 숫자를 비교해보자.
최대 100자리의 두 숫자가 입력되면 작은수와 큰 수를 차례대로 출력하시오.

입력

정수 두개가 입력된다. (최대 100자리) - 같은 숫자는 입력되지 않는다.

출력

작은수 큰수 순서로 출력한다.

내 코드
str_1, str_2 = input().split()

len1 = len(str_1)
len2 = len(str_2)

if len1 > len2 :
    print(str_2, str_1)
elif len1 < len2 :
    print(str_1, str_2)
else:
    for i, j in zip(str_1, str_2):
        n = int(i)-int(j)
        if n < 0:
            print(str_1, str_2)
            exit()
        if n > 0:
            print(str_2, str_1)
            exit()
    
    print(str_1, str_2)
다른 사람 코드
a, b = map(int, input().split())

if a>b: print(b , a)
else: print(a , b)

feedback

string으로 비교하는 것에만 꽂혀있었던것 같다.
숫자로 변환해버리면, 메모리 오류가 날것 같다는 생각 때문이였다.

  • 파이썬 int 형의 크기는 28바이트가 시작임
  • 파이썬은 arbitrary precision이라고 하여 데이터의 크기만큼 메모리를 할당한다는 특징이 있음

따라서 위와 같은 경우에는 100자리 수를 할당하더라도 메모리 오버플로우 문제가 없었지만, 메모리 사용 제한이 있는 코딩테스트 같은 경우에는 이 점이 문제가 될 수 있다.

오버플로우(Overflow)란? - 버퍼 오버플로우
C언어에서 변수 혹은 상수의 값은 메모리에 직접 저장이 된다. int 변수의 경우 4바이트의 메모리가 할다오디기 때문에 4바이트 이내의 용량(?)을 갖는 int 형태의 변수를 저장할 수 있다.
C에서는 데이터 타입에 따라 컴퓨터가 할당할 바이트 수가 정해져있기 때문에, 항상 오버플로우가 발생할 위험이 있다.

  • 파이썬에는 오버플로우가 없다?

    python2에서는 정수형 데이터 타입이 int와 long 두가지가 있었다. int형은 4바이트 메모리를 할당하였고, long은 arbitrary precision을 따르는 데이터 형태라고 한다. int 타입 변수의 값이 표현 범위를 넘어가게 되면 자동으로 long으로 타입 변경되는 형식이였다고 한다.

  • python3에서는 long type이 없어지고 int형 타입만 남게 됨으로써, int형이 arbitrary precision을 지원하게 되어 메모리 오버플로우가 발생하지 않게 되었다고 한다.

  • 하지만 python3에도 pydata stack을 사용하는 numpy/pandas 같은 패키지를 사용할 땐 C스타일이 유지되기 때문에 오버플로우 발생을 조심해야한다.

참고및출처
https://lubiksss.github.io/python/python_sizeof_int/
https://ahracho.github.io/posts/python/2017-05-09-python-integer-overflow/

profile
Soominlee

0개의 댓글