백준 15596

낚시하는 곰·2025년 3월 15일

krafton jungle

목록 보기
13/52

문제를 풀면서 느낀 점

이 문제를 딱 보자마자 느낀 것은 'for문을 돌려야겠다'였다. 당연히 틀렸다. 일단 100만에서 1000만까지의 정수를 메모리에 저장하는 것만으로도 많은 시간이 소요될 것이다. 당연히 '어떻게 하면 효율적으로 데이터를 저장하고 사용할 수 있을까?' 라는 질문을 던질 수 밖에 없다.

📌 내부 동작 과정

단계변수 상태동작
sum_a = 0변수 초기화
i = 1리스트 a의 첫 번째 요소 가져옴
sum_a = 0 + 1 = 1sum_ai 값을 더함
i = 2리스트 a의 두 번째 요소 가져옴
sum_a = 1 + 2 = 3sum_ai 값을 더함
i = 3리스트 a의 세 번째 요소 가져옴
sum_a = 3 + 3 = 6sum_ai 값을 더함
i = 4리스트 a의 네 번째 요소 가져옴
sum_a = 6 + 4 = 10sum_ai 값을 더함
i = 5리스트 a의 다섯 번째 요소 가져옴
sum_a = 10 + 5 = 15sum_ai 값을 더함
print(sum_a)15 출력

for문을 돌리면 값의 주소에 있는 메모리에서 가져옴 -> i라는 변수에 값을 저장 -> 합이라는 연산 과정을 거치고 -> sum_a(주소)에 값을 저장한다 -> 무한 반복

직접 실행해보면 정말 시간 많이 걸린다...

컴프리헨션

내가 알기론 파이썬 코드 간단하게 작성하려고 쓰는 문법 정도인 줄 알았었는데... 연산 속도 감소 옵션 또한 갖고 있었다... 실제로 백준 15596번 문제에서

sum_a = [i for i in a]
answer = sum(sum_a)

위 코드가 통과된다(for문은 통과 안되는데...). 근데 여기서 또 한 가지 중요한 사실은 sum에 있다.


sum 너란 녀석은...

python에 sum()이라는 함수가 있다. 사실 sum 함수도 for문으로 만든 건 줄 알았다... 하지만 자료를 조금 찾아보니 내 생각이 틀렸다는 걸 알 수 있었다.

📌 핵심 동작:

  • sum() 함수는 내부적으로 C 언어로 구현된 최적화된 반복문을 사용하여 리스트의 합을 빠르게 계산
  • for문과 같은 방식으로 동작하지만, Python 인터프리터보다 훨씬 빠름

C언어로 구현했다고 한다...ㄷㄷ 전혀 몰랐다(알고 있었으면 sum 바로 썼지..). 여기서 내가 깨달은 것은 python에서 사용하는 함수들이 그냥 자기 편하려고 만들어진 게 아니라는 것이다. 각각 의미가 있는 게 아닐까?


📌 sum() 함수 내부 동작 과정

단계변수 상태동작
total = 0변수 초기화
item = 1리스트 a의 첫 번째 요소 가져옴
total = 0 + 1 = 1totalitem 값을 더함
item = 2리스트 a의 두 번째 요소 가져옴
total = 1 + 2 = 3totalitem 값을 더함
item = 3리스트 a의 세 번째 요소 가져옴
total = 3 + 3 = 6totalitem 값을 더함
item = 4리스트 a의 네 번째 요소 가져옴
total = 6 + 4 = 10totalitem 값을 더함
item = 5리스트 a의 다섯 번째 요소 가져옴
total = 10 + 5 = 15totalitem 값을 더함
return total15 반환

🚀 실행 속도 비교 (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배 이상 빠름!


결론

결론이라고 적었지만 느낀 점이다. 최적화(?)에 대한 감(?)이 조금 생긴 것 같다.

profile
취업 준비생 낚곰입니다!! 반갑습니다!!

0개의 댓글