[프로그래머스][Python] 기사단원의 무기

Eunding·2024년 4월 4일

algorithm

목록 보기
11/110

오늘의 회고

오늘은 프로그래머스의 기사단원의 무기 문제를 풀어봤다.
처음에 쉬운 문제인 줄 알았는데 시간 초과가 나서 당황했던 문제이다.

시도한 것

약수의 개수를 먼저 1부터 그 수까지 세서 구하고 limit 초과하면 power를 더하는 방식으로 정직하게? 풀었다.
하지만 나온 건 시간 초과,,,

def solution(number, limit, power):
    answer = 0
    l = []
    for i in range(1, number+1):
        cnt = 0
        for j in range(1, i+1):
            if i % j == 0:
                cnt += 1
        l.append(cnt)
    for i in range(len(l)):
        if l[i] <= limit:
            answer += l[i]
        else:
            answer += power
    return answer

배운 점

약수의 개수를 구하는 문제에서 시간 복잡도를 줄이는 key point!
Reference) https://aiday.tistory.com/69

약수는 짝이 맞춰서 있기 때문에 숫자의 제곱근까지만 반복

WHY?
12의 제곱근은 3.4XX인데 이때 [1, 2, 3]으로 약수가 구해지고 12를 이 약수들로 나누면 자연스레 [12, 6, 4]의 약수도 구해진다. 이렇게 하게 되면 제곱근 이상의 값까지 반복하지 않아도 불필요한 연산 없이 구할 수 있다.

+) 그래서 코드 구현할 때 기본적으로 2개씩 더하면 되지만 완전 제곱수의 제곱근인 경우는 중복 카운트 방지를 위해 하나만 더해야 한다!

정답 코드

def solution(number, limit, power):
    l = []
    for i in range(1, number+1):
        cnt = 0 # 약수 개수
        for j in range(1, int(i**0.5)+1): # 1~i의 제곱근
            if i % j == 0:
                cnt += 1
                if j ** 2 != i: # 제곱해서 i가 아니면 약수가 하나 더 있음
                    cnt += 1
            if cnt > limit: # 제한수치 초과
                cnt = power
                break
        l.append(cnt)
    
    return sum(l)

2개의 댓글

comment-user-thumbnail
2024년 4월 4일

안녕하세요, 99클럽 그룹 리더 조커입니다!
제곱근을 이용해서 약수의 개수를 구하는 방법 잘 배워갑니다.
수학적 테크닉이 들어가는 건 어렵네요..

앞으로도 힘내서 매일 TIL 도전해 보세요! 화이팅입니다 :)

99클럽 https://bit.ly/3TN5TBL

1개의 답글