티스토리 뷰
1. 왜 시간 복잡도를 고려해야 하는가?
소프트웨어 엔지니어링에서 단순히 작동하는 코드를 작성하는 것은 기본에 불과하다. 확장 가능한 시스템을 구축하기 위해서는 입력 데이터의 크기(n) 증가에 따른 리소스 소모 정도를 예측할 수 있어야 한다. 시간 복잡도는 알고리즘의 절대적인 실행 시간을 측정하는 것이 아니라, 데이터 증가량에 따른 연산 횟수의 성장률을 의미한다.
2. Big-O 표기법
최악의 상황에서도 보장되는 성능을 나타내기 위해 Big-O 표기법을 사용한다. 실무에서는 평균적인 케이스보다 최악의 케이스를 기준으로 시스템의 가용성을 판단하는 것이 안전하다. 엔지니어는 시스템이 무너지는 지점을 정확히 파악하고 있어야 하기 때문이다.

| 표기법 | 명칭 | 설명 | 대표적 사례 |
| $O(1)$ | Constant Time | 입력 크기와 무관하게 즉시 수행 | Hash Table 조회, Stack Push/Pop |
| $O(\log n)$ | Logarithmic Time | 연산마다 탐색 범위가 절반으로 감소 | Binary Search (이진 탐색) |
| $O(n)$ | Linear Time | 데이터 양에 비례하여 선형적으로 증가 | Unsorted Array 전체 탐색 |
| $O(n \log n)$ | Linear-Logarithmic | 효율적인 정렬 알고리즘의 기준 | Merge Sort, Quick Sort (평균) |
| $O(n^2)$ | Quadratic Time | 이중 루프 발생, 데이터 증가 시 급격히 느려짐 | Bubble Sort, 적절하지 못한 중첩 반복문 |
3. 실무적 관점에서의 최적화 전략
1) 루프 구조의 최적화
중첩 루프($O(n^2)$)는 데이터가 10,000건만 넘어가도 시스템 성능에 치명적인 영향을 준다. 이를 $O(n)$이나 $O(n \log n)$으로 낮추는 것이 리팩토링의 핵심이다. 필요에 따라 메모리를 추가로 점유하더라도 시간 복잡도를 개선하는 Trade-off 전략을 적극적으로 검토해야 할 것이다.
2) 자료구조의 적절한 선택
단순히 데이터를 담는 것이 목적이 아니라, 어떤 연산(삽입, 삭제, 검색)이 빈번한가에 따라 자료구조를 선택해야 한다. 검색이 빈번하다면 Array 대신 Hash 기반 자료구조를 선택하여 $O(1)$을 지향해야 하며, 정렬된 상태 유지가 중요하다면 $O(\log n)$을 보장하는 Balanced Tree 구조를 채택하는 것이 타당하다.
3) 하드웨어 성능에 의존하지 말 것
"서버 사양을 높이면 된다"는 접근은 기술적 부채를 양산할 뿐이다. 비효율적인 알고리즘은 인프라 비용을 기하급수적으로 증가시키며, 특정 임계점에서 반드시 장애를 유발한다. 코드 수준의 최적화가 선행되지 않은 리소스 증설은 근본적인 해결책이 될 수 없음을 명심해야 한다.
4. 결론
시간 복잡도를 분석하는 습관은 코드 리뷰 시 주관적인 의견이 아닌 기술적 근거를 제시할 수 있게 한다. 모든 로직을 작성할 때 본인이 작성한 코드가 어느 정도의 성장률을 가지는지 반드시 자문해 보아야 한다. 효율적인 알고리즘 설계야말로 비용 절감과 시스템 안정성을 동시에 확보할 수 있는 엔지니어의 핵심 역량이 될 것이다.
'What I Learned > Computer Science' 카테고리의 다른 글
| [컴퓨터구조 & 운영체제] - 핵심 기초 (0) | 2022.11.11 |
|---|
- Total
- Today
- Yesterday
- Wil
- 2903
- 4134
- MySQL
- 10807
- 코육대
- 5597
- 2053
- 항해+
- Programmers
- 17103
- 24723
- 24313
- 2587
- 벡준
- 항해 플러스
- programmer
- 백준
- Python
- 25192
- til
- 13241
- 2738
- 25501
- 13909
- SQL
- 20920
- 1269
- 26069
- 24060
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |