
| 주제 | 핵심 포인트 |
|---|---|
| 배열 | 인덱스 접근 O(1), 크기 고정, 중간 삽입/삭제 O(n) |
| 선형 검색 | 정렬 불필요, 최선 O(1) · 최악 O(n) |
| 이진 검색 | 정렬 필요, 최악 O(log n) |
| 피보나치(재귀) | 단순 재귀 O(2ⁿ) → 메모이제이션/반복으로 O(n) 권장 |
| 리스트 | 배열 기반: 접근 O(1) / 연결 리스트: 삽·삭제 O(1)(위치 알고 있을 때) |
| 스택 | LIFO, push/pop O(1) |
| 큐 | FIFO, offer/poll O(1), 원형 큐로 공간 재사용 |
| 덱 | 양끝 삽입/삭제 O(1) |
장점
단점
앞에서부터 차례로 비교
정렬된 배열에서 중간값 기준으로 절반씩 버리기
F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2)public class Fibonacci {
public static int fibonacci(int n) {
if (n <= 1) return n; // Base Case
return fibonacci(n - 1) + fibonacci(n - 2); // Recursive Case
}
public static void main(String[] args) {
int n = 10;
System.out.println("F(" + n + ") = " + fibonacci(n));
}
}
단순 재귀는 중복 계산으로 O(2ⁿ). 실무/코테는 DP(메모이제이션) 또는 반복문으로 O(n) 권장.
자료구조: 데이터를 효율적으로 저장/관리하는 방법
ADT(추상 자료형): 데이터 + 연산의 규약만 정의, 구현은 감춤
순서가 있는 집합, 인덱스/포인터로 접근
add(i,x), remove(i), get(i), set(i,x), indexOf(x), size(), isEmpty(), clear()
| 구현 | 접근 | 삽입 | 삭제 | 공간 |
|---|---|---|---|---|
| 배열 기반 | O(1) | O(n) | O(n) | O(n) |
| 연결 리스트 | O(n) | O(1)* | O(1)* | O(n) |
| * 삽입/삭제 위치의 노드를 이미 알고 있다면 O(1); 위치 탐색까지 포함하면 O(n) |
LIFO, 함수 호출 스택/수식 평가
push, pop, peek, isEmpty, size, clear, search
| 구현 | 접근 | push | pop | 공간 |
|---|---|---|---|---|
| 배열/연결리스트 | O(1) (top) | O(1) | O(1) | O(n) |
FIFO, 작업 스케줄링/스트림 처리
offer, poll, peek, isEmpty, size, clear
| 구현 | 접근 | 삽입(offer) | 삭제(poll) | 공간 |
|---|---|---|---|---|
| 배열 큐 | O(1) | O(1) | O(1) | O(n) |
| 원형 큐 | O(1) | O(1) | O(1) | O(n) (공간 재사용) |
| 연결 리스트 | O(1) | O(1) | O(1) | O(n) |
양쪽 끝에서 삽입/삭제 가능한 큐
addFirst/Last, offerFirst/Last,
removeFirst/Last, pollFirst/Last,
getFirst/Last, peekFirst/Last, isEmpty, size, clear
| 구현 | 접근 | 앞/뒤 삽입 | 앞/뒤 삭제 | 공간 |
|---|---|---|---|---|
| 배열(순환) | O(1) | O(1) | O(1) | O(n) |
| 이중 연결 리스트 | O(1) | O(1) | O(1) | O(n) |