코드를 짜기 전에, "이 방법이 얼마나 빠른가"를 재는 눈을 먼저 기르면 코테가 쉬워져요. 이번 장은 그 자(尺)인 시간복잡도(Big-O)를 큰 그림으로 잡습니다.
🎯 이 장을 끝내면
자료구조와 알고리즘이 각각 무엇인지 설명할 수 있어요.
같은 문제도 방법에 따라 성능이 크게 다르다는 걸 이해해요.
Big-O 표기가 무엇을 재는지 알아요.
대표 복잡도 O(1) · O(log n) · O(n) · O(n log n) · O(n²)의 순서를 감으로 잡아요.
📖
개요
자료구조와 알고리즘이 뭔가요?
한 문장으로 먼저 잡고, 천천히 풀어볼게요.
🧩 자료구조 = 그릇, 알고리즘 = 방법자료구조(Data Structure) — 데이터를 어떻게 담고 관리할지를 정한 방식이에요. 배열·스택·큐·해시·트리 등이 있고, 각자 잘하는 일이 달라요. 알고리즘(Algorithm) — 문제를 푸는 절차·방법이에요. 정렬·탐색·재귀 같은 것들이죠.
💡 요리로 치면 자료구조는 재료를 담는 그릇, 알고리즘은 조리법이에요. 좋은 그릇과 좋은 조리법을 고르는 게 이 과목의 핵심이에요.
시간복잡도Big-OO(1)O(log n)O(n)O(n log n)O(n²)코딩테스트
🧭
이 코스의 예시 언어. 코드 예시는 브라우저에서 바로 실행되는 JavaScript로 보여드려요. 하지만 알고리즘의 논리는 자바·파이썬 등 어떤 언어에도 똑같이 통해요. 필요하면 자바와의 차이도 짚어드릴게요.
⚡
왜 성능?
같은 답, 다른 속도
1부터 n까지의 합을 구하는 두 가지 방법으로 느껴봐요.
1부터 n까지 더하기를 두 방법으로 해볼게요. 결과는 같지만 일하는 양이 완전히 달라요.
🐢 방법 A — 하나씩 다 더하기
function sumA(n) {
let total = 0;
for (let i = 1; i <= n; i++) { // n번 반복
total += i;
}
return total;
}
n이 100만이면 100만 번 더해요. n에 비례해서 일이 늘어요 → O(n).
🐇 방법 B — 공식으로 한 방에
function sumB(n) {
return n * (n + 1) / 2; // 반복 없이 계산 한 번
}
n이 아무리 커도 계산 한 번이면 끝나요 → O(1).
💡 같은 정답인데, n이 커질수록 방법 B가 압도적으로 빨라요. 이렇게 "방법의 효율"을 재는 자가 바로 시간복잡도예요.
📐
Big-O
Big-O는 "입력이 커질 때의 증가 추세"를 재요
정확한 초 단위가 아니라, 커질수록 얼마나 가팔라지는지를 봐요.
Big-O 표기법은 입력 크기 n이 커질 때 연산 횟수가 얼마나 빠르게 늘어나는지를 나타내요. O(n)은 "입력에 비례해서 늘어난다", O(1)은 "입력과 무관하게 일정하다"는 뜻이에요.
🔤
시간복잡도(Time Complexity) — 어떤 방법이 일을 끝내기까지 필요한 연산 횟수가 입력 크기에 따라 얼마나 늘어나는지를 재는 자예요. 실제로 걸린 초가 아니라 "해야 할 일의 양"을 봐요. 그래서 컴퓨터가 빠르든 느리든 방법 자체의 효율을 비교할 수 있어요.
🔤
빅오(Big-O) — 시간복잡도를 적는 표기법이에요. O(n)의 O는 "대략 이 정도 규모(Order)"라는 뜻으로, 입력이 2배가 되면 일이 몇 배로 느는지를 한눈에 보여줘요. 예를 들어 O(n)은 입력 2배 → 일도 2배, O(n²)은 입력 2배 → 일이 4배예요.
🔤
공간복잡도(Space Complexity) — 시간이 아니라 추가로 쓰는 메모리(저장 공간)가 입력 크기에 따라 얼마나 늘어나는지를 같은 방식으로 재는 거예요. 시간을 아끼려고 메모리를 더 쓰기도 해서, 둘은 자주 맞바꿔져요.
🎯 세 가지 약속1. 큰 흐름만 본다 — 컴퓨터·언어마다 실제 속도는 다르니, "커질수록 어떤 곡선을 그리나"라는 추세만 봐요. 2. 최악의 경우 기준 — 보통 가장 나쁜 상황(worst case)을 기준으로 표기해요. (배열에서 찾는 값이 맨 끝에 있을 때 등) 3. 상수·낮은 항은 버린다 — O(2n + 3)은 그냥 O(n). n이 커지면 가장 빨리 자라는 항만 중요해요.
📊
대표 복잡도
이 다섯 개만 감으로 잡아도 충분해요
빠른 것부터 느린 것 순서로.
복잡도
뜻 (n이 커질 때)
예시
O(1) 상수
입력과 상관없이 일정
배열 인덱스 접근 arr[5], 해시 조회
O(log n) 로그
절반씩 줄이며 처리 (아주 느리게 증가)
이진 탐색
O(n) 선형
입력에 비례
배열 전체 한 번 순회
O(n log n)
선형보다 조금 더
효율적 정렬(병합·퀵)
O(n²) 제곱
이중 반복 (급격히 증가)
모든 쌍 비교, 버블 정렬
🔤
인덱스(index) — 배열에서 각 칸에 매겨진 번호예요. 0부터 시작해서 arr[0]는 첫 칸, arr[5]는 여섯 번째 칸이죠. 번호만 알면 그 칸으로 바로 갈 수 있어서 접근이 O(1)이에요.
🔤
로그 시간 O(log n) — 후보를 매번 절반으로 접어 나가는 방식이에요. 그래서 아주 천천히 늘어요 — 1,024개도 약 10번, 100만 개도 약 20번이면 끝나요. 입력이 2배가 돼도 딱 한 단계만 더 늘어난다고 보면 돼요.
💡
느낌으로: n=1,000,000일 때 O(log n)은 약 20번, O(n)은 100만 번, O(n²)은 1조 번이에요. 그래서 코테에선 O(n²)이 시간 초과의 단골 원인이에요.
🖼️ 그림으로 보기 — Big-O 성장 비교
입력 n이 커질수록 벌어지는 정도가 복잡도예요. O(1)·O(log n)은 거의 안 늘고, O(n²)은 급격히 늘어요.
🧮
계산 규칙
복잡도, 이렇게 읽어요
간단한 규칙 두 개면 대부분 판단할 수 있어요.
📏 규칙 1 — 반복문을 보면 감이 와요반복문 한 개(n번 돌면) → O(n) 중첩 반복문 두 개(n × n) → O(n²) 반복 없이 계산/접근 → O(1) 절반씩 줄이는 구조 → O(log n)
📏 규칙 2 — 상수와 계수는 버려요O(2n + 3) → O(n) · O(n² + n) → O(n²)n이 아주 커지면 가장 빨리 자라는 항만 결과를 좌우해요. 그래서 상수·계수·낮은 차수는 무시해요.
🧪
이 과목의 실습 랩에서 지금 배운 개념으로 직접 함수를 짜고 실행·채점해볼 수 있어요. 상단 🧪 실습 버튼에서 열려요. 개념을 읽고 손으로 짜보면 훨씬 오래 남아요.