라떼군 이야기


1 / 14강

자료구조와 연산 비용

메모장에 이름을 적으면 연락처 목록이 됩니다. 이름순으로 정리하면 찾기는 쉬워지지만, 새 이름을 알맞은 자리에 끼워 넣어야 합니다. 데이터를 저장하는 방식은 어떤 작업을 얼마나 빠르게 할 수 있는지에 영향을 줍니다.

먼저 구분할 세 가지

얼마나 오래 걸릴까요?

입력의 크기를 n이라고 할 때, 입력이 늘어남에 따라 연산량이 어떻게 커지는지 봅니다. **빅 오(Big O)**는 그 증가율의 상한을 나타냅니다. 정확한 실행 시간이나 초 단위의 값은 아닙니다.

항상 어떤 연산의 어떤 경우인지 함께 보세요. 첫 항목이 정답이면 순차 탐색은 한 번 만에 끝납니다. 마지막 항목이 정답이거나 정답이 없으면 n개를 살펴봅니다.

작은 문제로 나누는 재귀

재귀는 함수가 자기 자신을 호출하는 방법입니다. 아래 함수는 양의 정수를 하나씩 줄여 출력합니다.

def countdown(n):
    if n <= 0:
        return
    print(n)
    countdown(n - 1)

countdown(3)

출력은 3, 2, 1입니다. n <= 0멈추는 조건, n - 1문제를 줄이는 단계입니다. 둘 중 하나를 놓치면 호출이 끝나지 않을 수 있습니다.

이 예제의 시간은 O(n)이고, 돌아올 위치를 기억하는 호출 공간도 O(n)입니다. Python은 재귀 호출 깊이에 제한이 있으므로 큰 입력에는 반복문이 더 알맞을 수 있습니다.

확인 문제

정렬되지 않은 연락처 1,000개에서 이름을 첫 항목부터 찾습니다. 그 이름이 없다면 몇 항목을 확인할까요? 입력이 2배가 되면 최악의 연산량은 어떻게 바뀔까요?

해설 보기

1,000개를 모두 확인합니다. 입력이 2배가 되면 확인할 항목도 2배입니다. 따라서 최악의 시간 복잡도는 O(n)입니다. 찾는 이름이 첫 항목에 있는 경우와 구분해야 합니다.

제품 기획, 개발 파트너 찾으시나요? 개인, 팀, 기업 모두 환영. 문제 정의부터 출시까지 함께합니다.