시간복잡도는 알고리즘이 실행되는 데 걸리는 시간을 수학적으로 표현한 것입니다.
특히, 입력 크기 ( n )에 따라 알고리즘의 실행 시간이 어떻게 변하는지 분석합니다.
Big-O 표기법은 입력 크기에 따른 실행 시간의 최악의 증가율을 나타냅니다.
주요 시간복잡도와 예시는 다음과 같습니다:
( O(1) ): 상수 시간
int getFirstElement(int[] arr) {
return arr[0]; // O(1)
}
( O(\log n) ): 로그 시간
int binarySearch(int[] arr, int target) {
// 이진 탐색 수행
}
( O(n) ): 선형 시간
int sumArray(int[] arr) {
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i]; // O(n)
}
return sum;
}
( O(n \log n) ): 선형 로그 시간
( O(n^2) ): 제곱 시간
void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// Swap
}
}
}
}
( O(2^n) ): 지수 시간
| 복잡도 | 증가율 | 예시 알고리즘 |
|---|---|---|
| ( O(1) ) | 일정 | 배열 요소 접근 |
| ( O(\log n) ) | 느리게 증가 | 이진 탐색 |
| ( O(n) ) | 선형 증가 | 단일 반복문 |
| ( O(n^2) ) | 기하급수적으로 증가 | 중첩 반복문, 버블 정렬 |
| ( O(2^n) ) | 급격히 증가 | 피보나치 (재귀) |
시간복잡도는 효율적인 개발을 위해 꼭 필요한 개념이라는 것을 배웠습니다. 단순히 "코드가 동작한다"에서 끝나는 것이 아니라, 성능을 고민하며 더 나은 해결책을 찾는 것이 개발자로서의 중요한 역량임을 깨달았습니다.