[백준] 17425번 약수의 합

HL·2021년 7월 17일
0

백준

목록 보기
103/104

링크

https://www.acmicpc.net/problem/17425

첫 시도

시간 초과

import sys


def solution():

    # 입출력
    read = sys.stdin.readline
    write = sys.stdout.write

    testcase = int(read())
    for _ in range(testcase):

        # g(n) 출력
        n = int(read())
        write(f'{get_g(n)}\n')


def get_g(n):

    g = 0

    for i in range(1, n+1):

        # n 이하의 자연수 중 i로 나누어 떨어지는 수의 갯수
        temp = n // i
        g += temp * i

    return g

solution()

두번째 시도

import sys


def solution():

    # 입출력
    read = sys.stdin.readline
    write = sys.stdout.write

    # 입력 받기
    testcase = int(read())
    numbers = [int(read()) for _ in range(testcase)]
    max_n = max(numbers)

    f = [0] * (max_n + 1)   # 약수의 합 리스트
    dp = [0] * (max_n + 1)

    # 더해줄 수
    for i in range(1, max_n+1):

        # 곱해줄 수
        j = 1
        while True:

            # i * j : 약수로 i를 갖는 수
            f[i * j] += i
            j += 1
            if i * j >= len(f):
                break

    # dp 구하기
    for i in range(1, max_n+1):
        dp[i] = dp[i-1] + f[i]

    # 출력
    for n in numbers:
        write(f'{dp[n]}\n')


solution()
profile
Frontend 개발자입니다.

0개의 댓글