📘 CodingMarble Learn

알고리즘 복잡도: 알고리즘의 작업량은 얼마나 빨리 늘어날까?

같은 문제를 푸는 알고리즘은 여러 가지인데, 어떤 것은 훨씬 많은 단계가 필요해요. 그래서 초시계 대신, 입력 크기 n이 커질 때 기본 단계가 몇 번인지 세어 알고리즘을 비교해요. 빅오 표기법은 이 증가 속도에 이름을 붙여요: O(1) 상수, O(log n) 로그, O(n) 선형, O(n log n), O(n²) 이차. 선형 탐색은 O(n), 이진 탐색은 O(log n)이고, 버블 정렬은 O(n²), 병합 정렬은 O(n log n)이에요. 사용하는 메모리의 양은 공간 복잡도라고 해요.

🎬 단계별 이야기

  1. 상자 16개 중에서 숫자 13을 찾아요. 상자를 하나씩 열어 볼 거예요. 연 상자 하나가 한 단계예요. 이것이 선형 탐색이고, 최대 n단계가 걸려요.
  2. 상자가 순서대로 놓여 있다면 가운데 상자를 열고, 틀린 쪽 절반은 버려요. 이것을 반복해요. 이진 탐색은 13을 단 4단계 만에 찾아요.
  3. 이제 n = 16일 때 다섯 종류의 알고리즘을 비교해요. 막대 높이는 단계 수예요. 어떤 막대는 아주 작고, 하나는 엄청나게 커요.
  4. 입력을 8에서 16으로 두 배로 늘려 봐요. O(n)은 2배, O(n²)은 4배가 되고, O(log n)은 딱 1만 늘어요.
  5. 1000개를 정렬해 봐요. 버블 정렬은 비교가 약 100만 번, 병합 정렬은 약 1만 번이에요. 입력이 클수록 증가 속도가 가장 중요해요.
  6. 이제 직접 해 봐요. n 슬라이더를 2에서 1024까지 움직이고, 어느 막대가 가장 빨리 치솟는지 보세요.

팁: 3D 화면을 드래그하면 돌아가요. 두 손가락으로 확대할 수 있어요.

🤔 헷갈리는 점, 한 번에 해결

그냥 초시계로 프로그램 시간을 재면 안 될까요?

시간은 컴퓨터마다 달라지지만 단계 수는 달라지지 않아요. 1단계에서는 초가 아니라 연 상자의 수를 세요.

이진 탐색은 왜 상자의 절반을 건너뛸 수 있나요?

상자가 순서대로 있기 때문이에요. 가운데가 찾는 값보다 작으면 그 왼쪽은 모두 더 작아서 정답이 될 수 없어요. 2단계의 회색 상자를 보세요.

빅오에서는 왜 상수를 버리나요?

빅오는 일이 얼마나 빨리 늘어나는지에 대한 거예요. n이 두 배가 되면 2n도 n도 두 배가 되니까 같은 방식으로 늘어나요. 4단계에서 두 배가 되는 모습을 볼 수 있어요.

O(n²)은 항상 O(n log n)보다 느린가요?

n이 아주 작으면 오히려 더 빠를 수도 있지만, n이 커지면 n²이 금방 앞질러요. 5단계에서 n = 1000이면 차이가 약 100배예요.

여기서 log n은 실제로 무슨 뜻인가요?

log₂ n은 n을 1이 될 때까지 몇 번 반으로 나눌 수 있는지예요. 1024이면 10이에요. 마지막 단계에서 슬라이더를 움직여, n이 두 배가 될 때마다 파란 막대가 1씩만 커지는 것을 보세요.

한 문제, 여러 가지 알고리즘

알고리즘은 문제를 풀기 위한 정확한 단계들의 모음이에요. 대부분의 문제는 알고리즘이 하나가 아니에요. 예를 들어 목록에서 이름을 찾을 때, 모든 이름을 하나씩 확인할 수도 있고, 목록이 정렬되어 있다면 계속 반으로 나눌 수도 있어요.

두 방법 모두 정답을 줘요. 차이는 효율성, 즉 작업량과 메모리가 얼마나 드는지예요. 좋은 프로그래머는 데이터가 커져도 빠른 알고리즘을 골라요.

걸린 시간으로 알고리즘 비교하기

초시계로 재는 것은 공정하지 않아요. 빠른 컴퓨터에서는 느린 알고리즘도 빨라 보이니까요. 그래서 입력 크기 n에 따라 기본 단계(비교, 교환, 덧셈)가 몇 번인지 세요.

최선, 평균, 최악의 경우

최선의 경우는 가장 운이 좋은 입력이에요(13이 첫 번째 상자에 있으면 1단계). 최악의 경우는 가장 운이 나쁜 입력이에요(13이 없으면 n단계). 보통 최악의 경우를 말해요. 그것이 약속이기 때문이에요. 알고리즘은 이보다 더 느려지지 않아요.

시간 복잡도와 공간 복잡도

시간 복잡도는 n에 따라 단계 수가 어떻게 늘어나는지 알려 줘요. 공간 복잡도는 n에 따라 추가 메모리가 어떻게 늘어나는지 알려 줘요. 병합 정렬은 빠르지만 추가 메모리가 필요하고, 버블 정렬은 추가 메모리가 거의 필요 없지만 느려요.

빅오 표기법

빅오는 작은 부분은 무시하고 증가 속도만 나타내요. 가장 큰 항만 남기고 상수는 버려요. 3n² + 5n + 2는 O(n²)가 돼요. n이 크면 n² 부분이 거의 전부이기 때문이에요.

빅오이름n = 16n = 1000예
O(1)상수11배열의 5번째 항목 읽기
O(log n)로그4약 10이진 탐색
O(n)선형161000선형 탐색, 가장 큰 값 찾기
O(n log n)n log n64약 10,000병합 정렬
O(n²)이차2561,000,000버블 정렬, 중첩 반복문

코드에서 쓰는 간단한 규칙: n개를 도는 반복문 하나는 O(n), 반복문 안의 반복문은 O(n²), 매번 문제를 반으로 줄이면 O(log n)이에요.

선형 탐색과 이진 탐색의 효율

선형 탐색은 항목을 하나씩 확인해요. 최악의 경우 비교가 n번이라서 O(n)이에요. 정렬되어 있든 아니든 어떤 목록에도 쓸 수 있어요.

이진 탐색은 정렬된 목록이 필요해요. 가운데를 보고, 너무 크면 오른쪽 절반을, 아니면 왼쪽 절반을 버려요. 한 단계마다 목록이 반으로 줄어서 최악의 경우 비교는 약 log₂ n + 1번, 즉 O(log n)이에요. 항목이 1,000,000개여도 1,000,000단계가 아니라 약 20단계면 돼요.

정렬 알고리즘의 효율

버블, 삽입, 선택 정렬은 반복문 안에 반복문이 있어서 비교가 약 n²/2번, 즉 O(n²)이에요. 삽입 정렬은 이미 정렬된 목록이라는 최선의 경우에는 O(n)이에요.

병합 정렬은 목록을 약 log₂ n번 반으로 나누고, 각 층에서 약 n만큼 일해요. 그래서 O(n log n)이고, 추가 메모리 O(n)이 필요해요.

이진 탐색은 정렬된 목록이 필요해요. 한 번만 찾는다면 먼저 정렬하는 비용(n log n)이 선형 탐색 한 번(n)보다 커요. 여러 번 찾는다면 한 번 정렬해 두는 것이 이득이에요.

사전 조건, 사후 조건, 재귀의 함정

사전 조건은 알고리즘을 시작하기 전에 참이어야 하는 것이에요(이진 탐색: 목록이 정렬되어 있음). 사후 조건은 끝났을 때 보장되는 것이에요(정렬: 모든 항목이 다음 항목보다 작거나 같음). 이것을 적어 두면 알고리즘을 테스트하고 증명하기 쉬워요.

재귀는 함수가 더 작은 문제에 대해 자기 자신을 부르는 것이에요. 자주 하는 실수:

해 보기: 두 탐색 경주시키기

종이 쪽지에 1부터 32까지 숫자를 적고, 순서대로 뒤집어 놓아요. 친구에게 비밀 숫자 하나를 고르게 해요. 먼저 하나씩 뒤집으며 몇 장을 뒤집었는지 세요. 그다음에는 항상 가운데 쪽지를 뒤집으며 찾아요. 5번 반복해 보세요. 어떤 방법이 6번을 넘기지 않았나요? 마지막 3D 단계의 슬라이더로 확인해 보세요(n = 32: log₂ 32 = 5).

핵심 공식과 정의

풀이 예제

1. 목록에 이름이 50개 있어요. 선형 탐색은 최선과 최악의 경우 비교가 몇 번 필요할까요?

최선의 경우: 이름이 맨 앞에 있으면 비교 1번. 최악의 경우: 이름이 맨 끝에 있거나 없으면 비교 50번. 선형 탐색은 O(n)이에요.

2. 정렬된 항목 1024개에서 이진 탐색이 필요로 하는 비교는 최대 몇 번일까요?

한 단계마다 목록이 반으로 줄어요: 1024 → 512 → 256 → 128 → 64 → 32 → 16 → 8 → 4 → 2 → 1. 반으로 나누기가 10번이고, 마지막 확인까지 하면 최대 11번 비교해요(log₂ 1024 = 10).

3. f(n) = 4n² + 10n + 7의 빅오를 구하세요.

가장 큰 항(4n²)만 남기고 상수 4를 버려요: O(n²).

4. 반복문이 i를 1부터 n까지 돌고, 그 안에서 또 다른 반복문이 j를 1부터 n까지 돌아요. 안쪽 줄은 몇 번 실행될까요?

i의 n개 값마다 n번씩이니까 n × n = n²번이에요. 시간 복잡도는 O(n²).

5. O(n²) 프로그램이 1000개를 정렬하는 데 2초 걸려요. 3000개는 대략 얼마나 걸릴까요?

n이 3배가 되면 n²은 3² = 9배가 돼요. 약 2 × 9 = 18초예요.

6. n = 1000개일 때 버블 정렬과 병합 정렬을 비교하세요.

버블 정렬: 약 n²/2 = 500,000번 비교. 병합 정렬: 약 n log₂ n = 1000 × 10 = 10,000번. 병합 정렬은 일이 약 50배 적지만 추가 메모리가 필요해요.

자주 하는 실수

연습 퀴즈

1. 선형 탐색의 최악의 경우 시간 복잡도는 얼마일까요?
2. 이진 탐색은 목록이 어떨 때만 쓸 수 있을까요?
3. n이 두 배가 되면 O(n²) 알고리즘은 대략 얼마나 걸릴까요?
4. 다음 중 O(n log n)인 정렬은 무엇일까요?
5. 7n + 300의 빅오는 무엇일까요?

연습: 직접 풀어 보세요

답을 입력하거나 고른 뒤 확인을 누르세요. 막히면 힌트를 보세요. 풀이는 답을 낸 뒤에 나타나요.

자주 묻는 질문

시간 복잡도란 쉽게 말해 무엇인가요?

입력이 커질 때 알고리즘의 단계 수가 어떻게 늘어나는지를 알려 줘요. 예를 들어 O(n)은 입력이 두 배가 되면 단계도 두 배가 된다는 뜻이에요.

시간 복잡도와 공간 복잡도는 무엇이 다른가요?

시간 복잡도는 단계 수를, 공간 복잡도는 추가 메모리를 재요. 병합 정렬처럼 빠르지만 메모리를 많이 쓰는 알고리즘도 있어요.

가장 빠른 빅오는 무엇인가요?

O(1)(상수)이 가장 좋고, 그다음이 O(log n), O(n), O(n log n), O(n²)예요. 지수 O(2ⁿ)은 흔한 것 중 가장 나빠요.

배우는 곳

Canada (Ontario)Grade 12C. Designing Modular Programs
Ukraine11 класAlgorithms
England (GCSE, A level)Year 103.1 Fundamentals of algorithms
USA (Common Core, NGSS, AP)Grade 11Selection and Iteration
USA (Common Core, NGSS, AP)Grade 11Algorithms and Programming
South Korea고등학교 2학년Algorithms and programming
South Korea고등학교 3학년Abstraction and algorithms

먼저 배우기

다음에 배우기