
| 시간 복잡도 | 의미 (한글/영문) | 설명 |
|---|---|---|
O(1) | 상수 시간 (constant time) | 입력 크기와 무관하게 항상 같은 시간. 가장 빠름. ex) 배열 인덱스로 접근 |
O(log N) | 로그 시간 (log time) | 입력이 커져도 천천히 증가. 이진 탐색 등에서 등장 |
O(N) | 선형 시간 (linear time) | 입력 크기만큼 실행 시간 증가. ex) 배열 전체 순회 |
O(N log N) | 로그 선형 시간 (log-linear time) | 병합 정렬(Merge Sort)이나 퀵 정렬 평균 시간 |
O(N²) | 이차 시간 (quadratic time) | 중첩 루프. ex) 버블 정렬, 브루트포스 2중 반복 |
O(N³) | 삼차 시간 (cubic time) | 3중 루프. ex) 플로이드-워셜 알고리즘 등 |
O(2^N) | 지수 시간 (exponential time) | 입력이 조금만 커져도 실행 시간이 폭증. 피해야 함. ex) 모든 부분 집합 찾기 |
사칙연산
절반씩 쪼갤때(이분 탐색), 상수 시간에 가까울 정도로 빠름
이분 탐색 (Binary Search)
정렬된 리스트나 배열에서 특정 값의 위치를 찾는 알고리즘
배열 하나씩 확인해서 어떤 원소가 존재하는지 찾을 때 사용(병합, 힙정렬...기반 알고리즘)
분할 정복 (Divide and Conquer)
병합 정렬은 배열을 절반으로 계속 나누어 더 이상 나눌 수 없을 때까지 반복
그런 다음, 정렬된 부분 배열들을 병합하여 최종적으로 정렬된 배열
재귀적 호출
각 부분 배열을 정렬하기 위해 재귀적으로 병합 정렬을 호출
병합 과정
정렬된 두 부분 배열을 병합할 때, 각 배열의 첫 번째 요소를 비교하여 작은 값을 결과 배열에 추가, 이 과정을 반복하여 최종적으로 정렬된 배열을 얻음
힙 자료구조
힙 정렬은 힙 자료구조를 기반함, 힙은 완전 이진 트리의 일종으로, 부모 노드가 자식 노드보다 항상 크거나 작은 특성을 갖음 (최대 힙 또는 최소 힙).
최대 힙 구성
먼저, 정렬되지 않은 배열을 최대 힙으로 구성
이 과정에서 부모 노드가 자식 노드보다 항상 크도록 힙 속성을 유지
정렬 과정
최대 힙의 루트 노드(가장 큰 값)를 힙의 마지막 요소와 교환하고, 힙 크기를 줄여서 다시 힙 속성을 유지. 이 과정을 반복하여 정렬된 배열을 얻음
동적 계획법, 넥센 문제 등등
동적 계획법
큰 문제를 여러 개의 작은 부분 문제로 나누어 해결하고, 각 부분 문제의 해를 저장하여 중복 계산을 피하는 알고리즘 설계 기법
동적 계획법의 활용
최단 경로 문제: 그래프에서 두 점 사이의 최단 거리를 구하는 문제에 사용
예를 들어, 구글 지도에서 길 찾기 기능와 같은 서비스에서 활용
배낭 문제(Knapsack Problem): 제한된 용량의 배낭에 최대한 많은 가치를 가진 물건들을 넣는 문제에 사용
문자열 유사도 계산
두 문자열의 유사도를 계산하는 문제에 사용
알고리즘의 실행 시간이 입력 크기 (n)의 세제곱에 비례하여 증가하는 것
플로이드 워셜
모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구해야 하는 경우를 구하는 알고리즘
알고리즘이 얼마나 빠르게 동작하는지 평가하기 위해 사용
let array = [1,2,3,4,5] // 5개의 데이터(N = 5)
let summary = 0; // 합계를 지정할 변수
// 모든 데이터를 하나씩 확인하며 합계를 계산
for(let i = 0; i < array.length; i++){
summary += array[i];
}
// 결과를 출력
console.log(summary)
수행시간은 데이터 개수 N에 비례할 것임을 예측 가능
O(N) : 선형 시간 복잡도
let array = [3,5,1,2,4] // 5개의 데이터(N = 5)
let summary = 0; // 합계를 지정할 변수
// 모든 데이터를 하나씩 확인하며 합계를 계산(5의 n제곱)
for(let i = 0; i < array.length; i++){ // i가 한번 바뀔때마다
for(let j= 0; j < array.length; j++){ // j가 다섯번씩 변경됨
let temp = array[i] * array[j]
console.log(temp)
}
// 결과를 출력
console.log(summary)
모든 2중문이 시간 복잡도가
O(N²)은 아니니 소스코드가 내부적으로 호출하는 함수 고려
O(N²): 이차 시간 복잡도
범위를 미리 파악하고 역으로 어느 정도로 동작하는지 이해해서 푸는 것