작성: Corn/sec, ChatGPT, 편집: Corn/sec
약수의 합을 구하는 문제입니다.

가장 먼저, 일반적인 for문을 이용해 약수의 합을 구하는 코드를 살펴보겠습니다.
def solution(n):
answer = 0
for i in range(1, n+1): # 1부터 n까지 반복
if n % i == 0: # i가 n의 약수라면
answer += i # 합산
return answer
print(solution(12)) # 28 (1 + 2 + 3 + 4 + 6 + 12)
print(solution(5)) # 6 (1 + 5)
✅ 문제점
위 코드를 제너레이터 표현식을 사용하면 한 줄로 간단하게 바꿀 수 있습니다.
def solution(n):
return sum(i for i in range(1, n+1) if n % i == 0)
print(solution(12)) # 28
print(solution(5)) # 6
✅ 개선된 점
✅ 제너레이터 표현식의 장점
# 제너레이터 표현식이 익숙하지 않으시다면? 아래의 링크에서 예제로 연습해 보세요! #
[Python] 제너레이터 표현식(generator expressions) 연습 예제
위 방식은 O(n)의 시간 복잡도를 가집니다.
하지만 제곱근(√n)까지만 탐색하는 방식을 활용하면 O(√n)으로 최적화할 수 있습니다.
def optimized_solution(n):
result = 0
for i in range(1, int(n ** 0.5) + 1): # 1부터 √n까지만 탐색
if n % i == 0: # i가 약수라면
result += i
if i != n // i: # 중복 방지 (제곱수가 아닐 경우)
result += n // i
return result
print(optimized_solution(12)) # 28
print(optimized_solution(5)) # 6
print(optimized_solution(36)) # 91 (1+2+3+4+6+9+12+18+36)
✅ 개선된 코드의 원리
✅ 성능 비교
| 방식 | 시간 복잡도 | 실행 속도 (n=1,000,000 기준) |
| 기본 for문 | O(n) | 느림 |
| 제너레이터 표현식 | O(n) | 중간 |
| 제곱근 최적화 | O(√n) | 가장 빠름 🚀 |
| 방식 | 코드 길이 | 성능 | 메모리 효율성 | 추천 대상 |
| for문 사용 | 길다 | 느림 (O(n)) | 낮음 | 초보자, 직관적 이해 |
| 제너레이터 표현식 | 짧다 | 보통 (O(n)) | 높음 | 간결한 코드 작성 |
| 제곱근 최적화 | 중간 | 빠름 (O(√n)) | 높음 | 성능 최적화 필요 시 |
📌 실제 프로젝트에서 어떤 방식을 사용할까?
이번 포스팅에서는 약수의 합을 구하는 방법을 기본적인 for문 → 제너레이터 표현식 → 성능 최적화(O(√n)) 순서로 차근차근 살펴보았습니다.
제너레이터 표현식을 활용하면 더 간결하고 효율적인 코드를 작성할 수 있으며,
시간 복잡도를 고려한 최적화(O(√n))를 적용하면 성능을 획기적으로 향상시킬 수 있습니다.
🎯 여러분도 다양한 방식으로 연습하면서 최적화된 코드를 작성해 보세요!
| [프로그래머스 풀이]: Lv.0 / 세균 증식 (0) | 2025.02.04 |
|---|---|
| [프로그래머스 풀이]: Lv.0 / 최댓값 만들기 (1) (0) | 2025.02.04 |
| [프로그래머스 풀이]: Lv.0 / 배열 뒤집기 (0) | 2025.01.29 |
| [프로그래머스] Lv.0 "0 떼기" (0) | 2024.12.31 |
| [프로그래머스 풀이]: [PCCE 기출문제] 6번 / 가채점 (0) | 2024.08.16 |