on my way
[프로그래머스 코딩테스트 연습] 기사단원의 무기 (Python3) Lv1 본문
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/136798
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr


처음 틀린 코드
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 (1) | 2024.08.22 |
|---|---|
| [프로그래머스 코딩테스트 연습] 땅따먹기 (Python3) Lv2 (0) | 2024.08.07 |
| [프로그래머스 코딩테스트 연습 > 정렬] 소수 찾기 (Python3) Lv1 (0) | 2024.08.04 |
| [프로그래머스 코딩테스트 연습] 예산 (Python3) Lv1 (0) | 2024.08.02 |
| [프로그래머스 코딩테스트 연습 > 정렬] 가장 큰 수 (Python3) Lv2 (1) | 2024.06.20 |