코딩테스트에서 시간복잡도의 중요성은 매우 크다.
많은 코딩테스트 문제집을 살펴보면 목차의 앞부분에 항상 시간복잡도에 대한 설명이 포함되어 있다. 이는 문제를 해결할 때 시간복잡도를 고려하는 것이 필수적임을 보여준다.
시간복잡도
시간복잡도란 주어진 문제를 해결하기 위해 필요한 연산 횟수를 나타낸다.
알고리즘이 얼마나 효율적인지를 평가하는 기준이 된다.
코딩테스트에서는 시간복잡도를 기반으로 알고리즘의 성능을 평가하고, 제한된 시간 안에 문제를 풀 수 있는지를 가늠한다.
왜 시간복잡도가 중요한가?
일반적으로 코딩테스트에서는 1억 번의 연산을 1초에 처리할 수 있는 기준을 사용하여 수행 시간을 예측한다.
따라서 문제를 풀 때는 주어진 입력 크기에 맞는 최적화된 알고리즘을 선택해야 한다. 만약 시간복잡도가 높은 알고리즘을 선택한다면, 실행 시간이 너무 오래 걸려 제한 시간을 초과할 수 있다.
연산횟수 = 알고리즘 시간 복잡도 X 데이터의 크기
예시: N개의 수를 2초 안에 정렬해야 하는 문제
예를 들어, N(1 <= N <= 1,000,000) 개의 수를 2초 안에 정렬해야 하는 문제가 있다고 가정해보자.
이때, 어떤 알고리즘을 선택하느냐에 따라 결과가 크게 달라질 수 있다.
버블정렬 vs 병합정렬
- 버블정렬의 시간복잡도는 O(N²)이다.
N이 1,000,000일 때, 버블정렬의 연산 횟수는 (1,000,000)² = 1,000,000,000,000번이므로, 2초 동안 가능한 연산 횟수인 200,000,000을 훨씬 초과하게 된다. 따라서 버블정렬로는 시간 초과가 발생한다. - 병합정렬의 시간복잡도는 O(NlogN)이다.
N이 1,000,000일 때, 병합정렬의 연산 횟수는 1,000,000log(1,000,000) ≈ 20,000,000번이므로, 2초 안에 충분히 문제를 해결할 수 있다. 따라서 병합정렬은 이 문제를 풀기에 적합한 알고리즘이라고 판단할 수 있다.