키워드 : 스택, 큐, 해시맵, 트리, 그래프, 시간 복잡도, 정렬 알고리즘
Object의 특성에 따라 나뉘는 데이터 구조
Array)List)ArrayList, LinkedList.LinkedList)Set)HashSet, LinkedHashSet, TreeSet.TreeSet)Map)HashMap, LinkedHashMap, TreeMap.TreeMap)PriorityQueue)Stack)Queue)LinkedList 또는 ArrayDeque.Deque)ArrayDeque.스택(Stack)과 큐(Queue)의 차이점과 실제로 사용되는 사례
연결 리스트(Linked List)의 구조와 사용 사례
배열 : 정적 자료구조로, 배열은 크기가 정해져 있어서 해당 크기만큼 연속된 메모리 주소를 할당받는다. 그러므로 인덱스를 갖는다. 크기를 수정이 불가능
연결 리스트 : 동적 자료구조로, 크기를 정할 필요 없으며 배열처럼 연속된 메모리 주소를 할당받지 않는다. 대신 노드가 있고 그 노드안에 데이터가 있고 다음 데이터를 가리키는 주소를 가지고 있다. 데이터의 추가/삭제가 자유롭다. 데이터 탐색시 임의로 접근이 불가능하여 순차적으로 접근해야 한다.
배열(Array)과 연결 리스트(Linked List)의 차이점과 시간 복잡도
| 특징 | 배열(Array) | 연결 리스트(Linked List) |
|---|---|---|
| 구조 | 메모리에 연속된 공간에 저장 | 각 노드가 포인터를 통해 연결된 구조 |
| 크기 조정 | 고정 크기(크기 변경이 어렵다, 동적 배열 제외) | 동적으로 크기 조정 가능 |
| 메모리 사용 | 추가 메모리 필요 없음 | 각 노드에 데이터 + 포인터 저장 공간 필요 |
| 데이터 접근 | 인덱스(index)를 통해 즉시 접근 가능 | 첫 노드부터 순차적으로 탐색해야 함 |
| 삽입/삭제 | 중간에서 삽입/삭제 시 비용 높음 (데이터 이동 필요) | 연결된 포인터만 수정하므로 비교적 효율적 |
| 연산 | 배열 (Array) | 연결 리스트 (Linked List) |
|---|---|---|
| 접근 (Access) | O(1) (인덱스로 바로 접근 가능) | O(n) (순차 탐색 필요) |
| 검색 (Search) | O(n) (순차 검색) | O(n) (순차 검색) |
| 삽입 (Insert) | O(n) (중간 삽입 시 이동 필요) | O(1) (처음/끝에 삽입 시) O(n) (중간 삽입 시 탐색 포함) |
| 삭제 (Delete) | O(n) (중간 삭제 시 이동 필요) | O(1) (처음/끝에서 삭제 시) O(n) (중간 삭제 시 탐색 포함) |
해시맵(HashMap)과 트리(Tree)의 차이점과 사용 사례
트리(Tree)와 그래프(Graph)의 차이점과 장단점
| 특징 | 트리(Tree) | 그래프(Graph) |
|---|---|---|
| 구조 | 계층적 구조(부모-자식 관계) | 네트워크 구조(노드 간의 자유로운 연결) |
| 루트 노드 | 항상 하나의 루트 노드 존재 | 루트 노드 없음 (자유로운 연결 가능) |
| 엣지 개수 | 항상 n-1개의 엣지 (n은 노드 개수) | 최대 (n(n-1))/2개의 엣지 가능 |
| 사이클 | 사이클이 존재하지 않음 | 사이클이 존재할 수 있음 |
| 연결 상태 | 항상 연결 그래프 (모든 노드가 연결됨) | 연결될 수도 있고 연결되지 않을 수도 있음 |
| 방향성 | 일반적으로 방향 그래프(Directed) | 방향성 그래프 또는 비방향성 그래프 가능 |
빅오(Big-O) 표기법과 시간 복잡도
알고리즘 성능을 분석할 때 사용되는 표기법으로, 입력 크기에 따라 알고리즘의 수행 시간이나 공간 사용량이 어떻게 증가하는지를 표현한다. 최악의 경우를 기준으로 표현하며 상수의 가장 큰 영향을 미치는 향으로 시간 복잡도를 나타낸다.
빅오 표기법의 예시
| 시간 복잡도 | 설명 | 예시 |
|---|---|---|
| O(1) | 입력 크기에 상관없이 일정한 시간 소요 | 배열에서 특정 인덱스 접근 |
| O(log n) | 입력 크기가 커질수록 느리게 증가 | 이진 탐색 |
| O(n) | 입력 크기에 비례하여 수행 시간 증가 | 단순 반복문 |
| O(n log n) | 반복문 안에 로그 성격의 작업이 포함됨 | 병합 정렬(Merge Sort), 퀵 정렬(Quick Sort) |
| O(n²) | 중첩된 반복문으로 인해 제곱에 비례 | 버블 정렬(Bubble Sort), 선택 정렬 |
| O(2ⁿ) | 입력 크기가 커질수록 시간 폭발적으로 증가 | 피보나치 재귀 알고리즘 |
배열
| 연산 | 시간 복잡도 |
|---|---|
| 접근 | O(1) |
| 검색 | O(n) |
| 삽입 (중간) | O(n) |
| 삭제 (중간) | O(n) |
연결리스트
| 연산 | 시간 복잡도 |
|---|---|
| 접근 | O(n) |
| 검색 | O(n) |
| 삽입 (처음/끝) | O(1) |
| 삭제 (처음/끝) | O(1) |
스택(Stack) & 큐(Queue)
| 연산 | 시간 복잡도 |
|---|---|
| 삽입 | O(1) |
| 삭제 | O(1) |
| 검색 | O(n) |
해시 테이블(Hash Table)
| 연산 | 평균 시간 복잡도 | 최악 시간 복잡도 |
|---|---|---|
| 검색 | O(1) | O(n) |
| 삽입 | O(1) | O(n) |
| 삭제 | O(1) | O(n) |
이진 탐색 트리(Binary Search Tree, BST)
| 연산 | 평균 시간 복잡도 | 최악 시간 복잡도 |
|---|---|---|
| 검색 | O(log n) | O(n) |
| 삽입 | O(log n) | O(n) |
| 삭제 | O(log n) | O(n) |
힙(Heap)
| 연산 | 시간 복잡도 |
|---|---|
| 삽입 | O(log n) |
| 삭제(최댓값/최솟값) | O(log n) |
| 검색 | O(n) |
그래프(Graph)
인접 행렬 (Adjacency Matrix)
| 연산 | 시간 복잡도 |
|---|---|
| 간선 추가/삭제 | O(1) |
| 간선 확인 | O(1) |
| 전체 탐색 | O(V²) |
인접 리스트 (Adjacency List)
| 연산 | 시간 복잡도 |
|---|---|
| 간선 추가/삭제 | O(1) |
| 간선 확인 | O(V) |
| 전체 탐색 | O(V + E) |
이진 탐색(Binary Search) 알고리즘과 시간 복잡도
정렬된 자료를 반으로 계속해서 나눠서 탐색하는 방법, 시간 복잡도는 O(logN)이다.
정렬 알고리즘 중 퀵 정렬(Quick Sort)과 병합 정렬(Merge Sort)의 차이점과 시간 복잡도
퀵 정렬과 병합 정렬은 둘 다 분할 정복 방식을 사용하는 효율적인 정렬 알고리즘이다.
그래프에서 깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS)의 차이점과 사용 사례