프로그래머스 연습문제
- Lv 1. 기사단원의 무기 (Python)
https://school.programmers.co.kr/learn/courses/30/lessons/136798
def get_yaksu_count(num):
count = 0
# for i in range(1, num+1):
# if(num % i == 0):
# count += 1
for i in range(1, int(num**(1/2))+1):
if(num % i == 0):
count += 1
if ((i**2) != num) :
count += 1
return count
def solution(number, limit, power):
answer = 0
yak_su = []
for i in range(1, number+1):
count = get_yaksu_count(i)
if(count > limit):
count = power
yak_su.append(count)
answer = sum(yak_su)
return answer
number
까지의 각 약수 개수를 구한 뒤 → limit
보다 큰 개수를 가진 값은 → power
로 변경하면 되는 간단한 알고리즘이다.number
까지의 약수의 개수를 구하는 부분이 만큼 걸리는데 여기서 number
의 최대로 들어갈 수 있는 값이 100,000이므로 절반의 테스트케이스에서 런타임에러가 발생하였다.n
을 1
부터 n의 제곱근
까지 하나씩 나눠본다 → 만약 i
가 자기자신과 나누어 떨어진다면 → i
의 제곱한 값을 확인 → 만약 i
가 n
의 제곱근이 아니면 → n // i
값 또한 약수▶️ 효율적인 약수 구하는 알고리즘 (시간복잡도 )
참고 : https://minnit-develop.tistory.com/16
def getMyDivisor(n):
divisorsList = []
for i in range(1, int(n**(1/2)) + 1):
if (n % i == 0):
divisorsList.append(i)
if ( (i**2) != n) :
divisorsList.append(n // i)
divisorsList.sort()
return divisorsList
뛰어난 글이네요, 감사합니다.