프로그래머스_피보나치 수

임정민·2022년 11월 26일
2

알고리즘 문제풀이

목록 보기
4/173
post-thumbnail

코딩테스트 연습 스터디 진행중 입니다. ✍✍✍
Notion : https://www.notion.so/1c911ca6572e4513bd8ed091aa508d67

문제

https://school.programmers.co.kr/learn/courses/30/lessons/12945

풀이

[나의 풀이]

import numpy as np

def solution(n):
    
    arr = np.array([0,1], dtype=np.float64)

    if n == 2:
        return 1
    
    for _ in range(n-1):
        arr = np.append(arr, (arr[len(arr)-1] + arr[len(arr)-2]) % np.float64(1234567))
        # arr[len(arr)-1] + arr[len(arr)-2]) 까지 계산하고 arr에 넣고 나중에 %12345667 하면 arrdp 넣는 과정중에 overflow 생김
        # 한번에 % 1234567 연산하고 넣으면 overflow 안생김
        # 즉, 연산하는 과정에서는 얼마든지 큰 수여도 됌. 연산이 끝난 후에 저장할 때만 범위를 맞춰주면 됌
    print(arr)
    
    answer = arr

    return answer 

[팀원의 풀이]

def solution(n):
    return fibonacci(n)%1234567

def fibonacci(n) :
    if n == 0 :
        return 0
    elif n == 1 :
        return 1
    else :
        return fibonacci(n-1) + fibonacci(n-2)

메모

  1. python3의 int() 와 numpy, pandas 의 int()는 다르다.

https://ahracho.github.io/posts/python/2017-05-09-python-integer-overflow/

python3의 int()에는 오버플로우가 없다.python 2에서는 정수형 데이터 타입이 int와 long 두 가지가 있었는데, int는 C에서의 그것과 같은 4바이트 데이터형이고, long은 arbitrary precision을 따르는 데이터형이다. 그래서 int 타입 변수의 값이 표현 범위를 넘어서게 되면 자동으로 long으로 타입 변경이 되는 형식이었다.
파이썬 3에서는 long 타입이 없어지고 int 타입만 남았는데, 이 int가 arbitrary precision을 지원하여 오버플로우가 발생하지 않게 되었다.하지만 파이썬3에서도 pydata stack을 사용하는 numpy/pandas 같은 패키지를 사용할 때는 C 스타일이 유지되기 때문에 오버플로우 발생을 고려해야 한다.

  • arbitrary-precision란?

arbitrary-precision은 사용할 수 있는 메모리양이 정해져 있는 기존의 fixed-precision과 달리, 현재 남아있는 만큼의 가용 메모리를 모두 수 표현에 끌어다 쓸 수 있는 형태를 이야기하는 것 같다. 예를 들어 특정 값을 나타내는데 4바이트가 부족하다면 5바이트, 더 부족하면 6바이트까지 사용할 수 있게 유동적으로 운용한다는 것이다.

  1. 연산하는 과정에서는 얼마나 큰 수 인지 상관이 없다. 자료형에 저장할 때에만 범위에 맞춰 주면 된다.
arr[len(arr)-1] + arr[len(arr)-2]) , 이후 %1234567 (X) 

(arr[len(arr)-1] + arr[len(arr)-2]) % np.float64(1234567)) (O)

감사합니다.🦋🦋🦋

profile
https://github.com/min731

0개의 댓글