baekjoon 10757

윤동환·2023년 1월 1일
0

Algorithm

목록 보기
23/54
post-thumbnail

큰 수 A + B

내가 작성한 코드

A, B = input().split()
A = A[::-1]
B = B[::-1]
LA = list(map(int, A))
LB = list(map(int, B))
gap = len(LA) - len(LB)
if (gap > 0):
    while gap != 0:
        LB.append(0)
        gap -= 1
elif (gap < 0):
    while gap != 0:
        LA.append(0)
        gap += 1
i = 0
answer = []
up = 0
while i < len(LA) or i < len(LB):
    answer.append(up)
    if LA[i] + LB[i] + up >= 10:
        up = 1
    else:
        up = 0
    answer[i] += (LA[i] + LB[i] - (up * 10))
    i += 1
if (up == 1):
    answer.append(1)
answer.reverse()
print(''.join(str(s) for s in answer))

고민한 부분

  • 경 단위가 넘어가는 수를 더하기 위한 자료형이 없었다. 그래서 string을 더하는 로직을 구현하였다.
  • string의 맨 뒷자리부터 수를 더하는 작업이 비효율적으로 느껴졌다.
    -> 각 string의 size를 구하고 각 size가 끝나는 시점을 비교하며 각 자리를 더해주는 것이 번잡하게 느껴졌다.

    해결 방법

    1. string을 뒤집어 0번째 index부터 계산하며 추가되는 숫자는 배열의 뒤에 붙여주자
    2. string을 일일히 int형변화를 계산할때마다 하지말고 map함수를 통해 먼저 각 index마다 적용시킨것을 list화하여 내장함수를 사용하도록 하자.
    3. 두수의 길이가 다를경우 추후에 더해줄 때 빈 메모리를 참조할 수 있으니 그 차이만큼 0으로 초기화를 해두자.
  • 각 자리수의 합이 10이 넘을경우
    처음엔 answer에 미리 1을 올려 담아 계산하고 10이 넘는경우10을 뺀 값을 넣어주었다.
    if LA[i] + LB[i] + answer[i] >= 10:
            answer.append((LA[i] + LB[i] - 10))
            answer.append(1)
        else:
            answer.append((LA[i] + LB[i]))
            answer.append(0)
    이런방식으로 중복되는 코드가 셍겼다. 이러한 부분을 해결하기 위해 올림을 관장하는 up이라는 변수를 두어 코드를 개선하였다.
  • 마지막 자리계산시 up이 되더라도 이미 주어진 수들의 계산 길이는 끝났기 때문에 up이 1이라면 1넣어주는 부분을 추가하였다.
  • list를 문자열화하여 한번에 출력하기 위해 for문의 list comprehension을 사용하였다.

    충격적인 부분..

    파이썬의 int 자료형은 경단위의 수또한 처리가 가능하다..
    A, B = map(int, input().split())
    print(A+B)

    int는 2147483648까지 아니냐구...
    역시 알고있던 지식이 가장 위험한것 같다..

어떻게 파이썬은 큰 수를 계산할 수 있는지 알아보았다.

파이썬의 특별한 int 자료형 변천사

  1. 기존 int로 처리하다 정수 오버플로우가 발생하면 python에서 long타입으로 처리를 하였다.
  2. 파이썬 3으로 넘어오고 PEP 237 로드맵에 따라 long 자료형이 int 자료형을 대체하게 되면서 파이썬의 정수형 데이터 타입은 int 밖에 존재하지 않게 되었다.
  3. long 타입은 무제한의 자릿수를 제공하는 정수형을 의미하는 Arbitrary precision을 지원한다.
  4. 즉, int 타입은 long타입을 의미하게 되었고 int type은 무제한의 짜릿수를 제공하는 정수형이 되었다.

    무제한의 자릿수를 어떻게 제공하는가
    파이썬의 int 자료형은 C 의 구조체 형태로 되어있으며 구조체에는 타입과 수를 저장할 수 있는 배열이 있다.
    파이썬은 10진수를 2^30으로 쪼개어 배열에 순차적으로 저장한다.
    즉, 32bit 운영체제에서 표현할 수 있는 정수의 최댓값인 2^30 −1을 벗어나지 않으며 저장할 수 있다.
    2^30보다 큰 10진수라면 그 수를 쪼개어 배열에 추가 저장하면 된다.

참고 블로그

profile
모르면 공부하고 알게되면 공유하는 개발자

0개의 댓글