이 문제를 딱 보자마자 느낀 것은 'for문을 돌려야겠다'였다. 당연히 틀렸다. 일단 100만에서 1000만까지의 정수를 메모리에 저장하는 것만으로도 많은 시간이 소요될 것이다. 당연히 '어떻게 하면 효율적으로 데이터를 저장하고 사용할 수 있을까?' 라는 질문을 던질 수 밖에 없다.
| 단계 | 변수 상태 | 동작 |
|---|---|---|
| ➊ | sum_a = 0 | 변수 초기화 |
| ➋ | i = 1 | 리스트 a의 첫 번째 요소 가져옴 |
| ➌ | sum_a = 0 + 1 = 1 | sum_a에 i 값을 더함 |
| ➋ | i = 2 | 리스트 a의 두 번째 요소 가져옴 |
| ➌ | sum_a = 1 + 2 = 3 | sum_a에 i 값을 더함 |
| ➋ | i = 3 | 리스트 a의 세 번째 요소 가져옴 |
| ➌ | sum_a = 3 + 3 = 6 | sum_a에 i 값을 더함 |
| ➋ | i = 4 | 리스트 a의 네 번째 요소 가져옴 |
| ➌ | sum_a = 6 + 4 = 10 | sum_a에 i 값을 더함 |
| ➋ | i = 5 | 리스트 a의 다섯 번째 요소 가져옴 |
| ➌ | sum_a = 10 + 5 = 15 | sum_a에 i 값을 더함 |
| ➍ | print(sum_a) | 15 출력 |
for문을 돌리면 값의 주소에 있는 메모리에서 가져옴 -> i라는 변수에 값을 저장 -> 합이라는 연산 과정을 거치고 -> sum_a(주소)에 값을 저장한다 -> 무한 반복
직접 실행해보면 정말 시간 많이 걸린다...
내가 알기론 파이썬 코드 간단하게 작성하려고 쓰는 문법 정도인 줄 알았었는데... 연산 속도 감소 옵션 또한 갖고 있었다... 실제로 백준 15596번 문제에서
sum_a = [i for i in a]
answer = sum(sum_a)
위 코드가 통과된다(for문은 통과 안되는데...). 근데 여기서 또 한 가지 중요한 사실은 sum에 있다.
python에 sum()이라는 함수가 있다. 사실 sum 함수도 for문으로 만든 건 줄 알았다... 하지만 자료를 조금 찾아보니 내 생각이 틀렸다는 걸 알 수 있었다.
📌 핵심 동작:
sum() 함수는 내부적으로 C 언어로 구현된 최적화된 반복문을 사용하여 리스트의 합을 빠르게 계산 for문과 같은 방식으로 동작하지만, Python 인터프리터보다 훨씬 빠름 C언어로 구현했다고 한다...ㄷㄷ 전혀 몰랐다(알고 있었으면 sum 바로 썼지..). 여기서 내가 깨달은 것은 python에서 사용하는 함수들이 그냥 자기 편하려고 만들어진 게 아니라는 것이다. 각각 의미가 있는 게 아닐까?
sum() 함수 내부 동작 과정| 단계 | 변수 상태 | 동작 |
|---|---|---|
| ➊ | total = 0 | 변수 초기화 |
| ➋ | item = 1 | 리스트 a의 첫 번째 요소 가져옴 |
| ➌ | total = 0 + 1 = 1 | total에 item 값을 더함 |
| ➋ | item = 2 | 리스트 a의 두 번째 요소 가져옴 |
| ➌ | total = 1 + 2 = 3 | total에 item 값을 더함 |
| ➋ | item = 3 | 리스트 a의 세 번째 요소 가져옴 |
| ➌ | total = 3 + 3 = 6 | total에 item 값을 더함 |
| ➋ | item = 4 | 리스트 a의 네 번째 요소 가져옴 |
| ➌ | total = 6 + 4 = 10 | total에 item 값을 더함 |
| ➋ | item = 5 | 리스트 a의 다섯 번째 요소 가져옴 |
| ➌ | total = 10 + 5 = 15 | total에 item 값을 더함 |
| ➍ | return total | 15 반환 |
timeit 측정)import timeit
# for문 방식
def with_loop():
sum_a = 0
for i in range(1, 1000001):
sum_a += i
return sum_a
# sum() 함수 사용
def with_sum():
return sum(range(1, 1000001))
# 실행 시간 측정
loop_time = timeit.timeit(with_loop, number=10)
sum_time = timeit.timeit(with_sum, number=10)
print(f"for문 실행 시간: {loop_time:.4f}초")
print(f"sum() 실행 시간: {sum_time:.4f}초")
🔹 결과 예시 (환경에 따라 다를 수 있음)
for문 실행 시간: 0.7894초
sum() 실행 시간: 0.2451초
📌 sum()이 약 3배 이상 빠름!
결론이라고 적었지만 느낀 점이다. 최적화(?)에 대한 감(?)이 조금 생긴 것 같다.