문제 확인

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

나의 풀이

from collections import defaultdict
# 성분의 곱을 계산할 수 있다.
from math import prod

# 약수 개수 구하기 1 : 소인수 분해 활용
def solution(number, limit, power):
    # 숫자 1 고려해서 초기 값 1로 설정
    answer = [1]
    for i in range(2, number + 1):
        # 소인수 분해 결과 저장 : 각 약수의 개수
        prime_cnt = defaultdict(int)
        for j in range(2, int(i ** 0.5) + 1):
            while i % j == 0:
                prime_cnt[j] += 1
                i //= j
        # 계산이 안 된 경우
        if i != 1:
            prime_cnt[i] += 1
        answer_temp = prod([k + 1 for k in prime_cnt.values()])
        answer.append(answer_temp)
    # 파워 제한
    answer = sum([i if i <= limit else power for i in answer])
    return answer
  • ii // j가 동일한 경우를 제외하기 위해서 set 함수를 사용 했다.
# 약수 개수 구하기 2 : 약수의 정의 활용
def solution(number, limit, power):
    answer = 1
    # 약수 검사
    for i in range(2, number + 1):
        answer_temp = set()
        for j in range(1, int(i ** 0.5) + 1):
            # 약수라면
            if i % j ==0:
                answer_temp.add(j)
                answer_temp.add(i // j)
        # 파워 리밋 적용
        answer += len(answer_temp) if len(answer_temp) <= limit else power
    return answer

참고

 

에라토스테네스의 체 혹은 소수판정 시 제곱근 까지만 확인하면 되는 이유

흔히 에라토스테네스의 체를 사용해 n 이하의 모든 소수를 구하려고 할 때, 효율적으로 구하기 위해 n의 제곱근( sqrt(n) ) 까지만 확인하곤 한다. 1년전쯤엔 n까지 다 확인하거나, 좀 머리 쓴다고 n/

nahwasa.com