on my way
[프로그래머스 코딩테스트 연습] 기사단원의 무기 (Python3) Lv1 본문
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/136798
처음 틀린 코드
def getDivisor(n):
cnt = 0
for i in range(1, n+1):
if n%i==0:
cnt +=1
return cnt
def solution(number, limit, power):
return sum([getDivisor(i) if getDivisor(i) <= limit else power for i in range(1,number+1)])
- 효율성 문제:
getDivisor
함수에서1
부터n
까지 모든 숫자에 대해 나눗셈 연산을 수행하므로, 시간 복잡도가 O(n)입니다. 이로 인해 숫자가 커질수록 연산량이 급격히 증가하여 비효율적이다.
- 제곱근 최적화 미사용:
- 약수를 찾는 과정에서
1
부터sqrt(n)
까지만 확인해도 충분하다. 이는 약수는 대칭적으로 존재하기 때문이다. - 예를 들어,
n = 36
일 때,(1, 36)
,(2, 18)
,(3, 12)
,(4, 9)
,(6, 6)
과 같은 쌍으로 약수가 존재하기에 이를 활용하면 연산을 대폭 줄일 수 있다.
- 약수를 찾는 과정에서
수정된 정답 코드
def getDivisor(n):
cnt = 0
for i in range(1, int(n**(0.5))+1):
if n % i == 0:
cnt += 1
if i != n // i:
cnt += 1
return cnt
def solution(number, limit, power):
return sum([getDivisor(i) if getDivisor(i) <= limit else power for i in range(1, number + 1)])
- 효율성 개선:
getDivisor
함수에서1
부터sqrt(n)
까지의 숫자에 대해서만 나눗셈 연산을 수행한다. 이로 인해 시간 복잡도가 O(sqrt(n))로 줄어들어 큰 숫자에 대해서도 효율적으로 약수를 계산할 수 있다.
- 중복 약수 처리:
i
와n // i
가 동일한 경우, 즉i * i == n
인 경우에는 중복해서 카운트하지 않도록if i != n // i
조건을 추가했다. 이를 통해 정확한 약수의 개수를 셀 수 있다.
전체 설명
- getDivisor 함수:
1
부터sqrt(n)
까지의 숫자i
에 대해n
이i
로 나누어 떨어지면,i
와n // i
가 약수임을 확인한다.- 이때
i
와n // i
가 동일하지 않은 경우에만 두 번 카운트하여 중복을 방지한다.
- solution 함수:
1
부터number
까지의 각 숫자에 대해 약수의 개수를 계산한다.- 약수의 개수가
limit
이하인 경우 해당 약수의 개수를, 그렇지 않은 경우power
를 결과에 더한다. - 최종적으로 이 값을 모두 합산하여 반환한다.
반응형
'algorithm > Python' 카테고리의 다른 글
[프로그래머스 코딩테스트 연습] 로또의 최고 순위와 최저 순위 (Python3) Lv1 (0) | 2024.08.22 |
---|---|
[프로그래머스 코딩테스트 연습] 땅따먹기 (Python3) Lv2 (0) | 2024.08.07 |
[프로그래머스 코딩테스트 연습 > 정렬] 소수 찾기 (Python3) Lv1 (0) | 2024.08.04 |
[프로그래머스 코딩테스트 연습] 예산 (Python3) Lv1 (0) | 2024.08.02 |
[프로그래머스 코딩테스트 연습 > 정렬] 가장 큰 수 (Python3) Lv2 (0) | 2024.06.20 |