일반적으로 약수를 구하는 방식을 생각해보면 0부터 해당 수까지 모두 나누어보며 나머지가 0인 수의 개수를 더하는 방식이 떠오르는데 코드로는 아래와 같다.
def yaksu(num):
answer = 0
for i in range(1,num+1):
if num%i == 0:
answer += 1
return answer
한 수의 약수만을 구할 때에는 정석적인 풀이지만
만약 1부터 100000까지 약수의 합을 구한다면 아래와 같은 시간이 소모된다
from tqdm import tqdm
from time import time
start = time()
result = 0
for i in tqdm(range(1,100001)):
result += yaksu(i)
end = time()
print(f'The answer is {result}\n spending time is {round(end-start, 2)}sec')
3분 28초가 소모되었다.
만약 계산 과정에서 i는 i, i*2, i*3...의 약수임을 이용하여
각 배수의 위치에 약수의 수를 더하면 loop 횟수를 획기적으로 줄일 수 있다.
코드로는 아래와 같다.
from tqdm import tqdm
from time import time
start = time()
number = 100000
l = [0 for i in range(number)]
for i in tqdm(range(number)):
for j in range(1, number // (i + 1) + 1):
l[(i + 1) * j - 1] += 1
result = sum(l)
end = time()
print(f'The answer is {result}\n spending time is {round(end-start, 2)}sec')
코드를 수정한 후 소요시간이
3분 28초 > 0.2초로 줄어들어 압도적인 성능 차이를 보여준다.
'코딩 잡동사니 > 코딩 꿀팁' 카테고리의 다른 글
Git 과거 데이터 및 히스토리 삭제 (0) | 2023.04.25 |
---|---|
[Python 꿀팁] 모듈 버전충돌시 코드 (0) | 2023.03.14 |
[Python 꿀팁] itertools로 조합(combination) 구하기 (0) | 2023.01.26 |
[Python 꿀팁] tqdm (0) | 2023.01.24 |
[Python 꿀팁] enumerate (0) | 2023.01.24 |