기록방
시간 복잡도 본문
💡 알고리즘에서 시간 복잡도
- 알고리즘 선택의 기준이 되는 시간 복잡도
- 코딩 테스트의 핵심 중 하나는 시간 복잡도를 고려해 적절한 알고리즘을 선택하는 것
- 주어진 문제를 해결하기 위한 연산 횟수 (일반적으로 1억번 연산을 1초로 간주해서 예측)
🚀 시간 복잡도 유형
- 빅-오메가(Ω(n)) : 최선일 때(best case)의 연산 횟수를 나타낸 표기법
- 빅-세타(Θ(n)) : 보통일 때(average case)의 연산 횟수를 나타낸 표기법
- 빅-오(O(n)) : 최악일 때(worst case)의 연산 횟수를 나타낸 표기법
⇒ 코딩 테스트에서는 빅-오 표기법을 기준으로 수행 시간을 계산 (최악을 염두)
🚀 시간 복잡도 활용 예시
N 개의 수를 오름차순 정렬한다 (1 <= N 1<= 1,000,000)
제한시간 2초
- 2초는 약 2억번 이하의 연산 횟수로 해결해야 함
- 연산 횟수 = 알고리즘의 시간 복잡도 X 데이터의 크기
- 버블 정렬을 사용한다면?
- 버블 정렬의 시간 복잡도 : O(n^2)
- 1,000,000 ^ 2 = 1,000,000,000,000 > 200,000,000 => 부적합 알고리즘
- 병합 정렬을 사용한다면?
- 병합 정렬의 시간 복잡도 : O(nlogn)
- 1,000,000 log 1,000,000 = 약 20,000,000 < 200,000,000 => 적합한 알고리즘
🚀 시간 복잡도 검출 기준
시간 복잡도 바탕의 코드 로직 개선
- 상수는 시간 복잡도 계산에서 제외
- 가장 많이 중첩된 반복문의 수행 횟수가 시간 복잡도의 기준
- 입력이 N일때 for문을로 0~N 반복
- for문 1개 : 연산 횟수 N => O(N)
- for문이 3개 : 연산 횟수 3N ⇒ O(N)
- 상수를 무시하므로 시간 복잡도가 같다
- for문 2개를 중첩 : 연산 횟수 N$^2$ ⇒ O(N$^2$)
- 일반 for문이 더 있다더라도 시간 복잡도는 가장 많이 중첩 된 for문이 기준이다
- 입력이 N일때 for문을로 0~N 반복
🚀 정리
작성한 코드에 시간복잡도를 도출할 수 있다면, 실제 코딩 테스트에서 시간 초과가 발생했을 때 문제가 되는 부분을 도출 할 수 있고, 연산에 더욱 효율적인 구조로 수정하는 작업으로 문제를 해결할 수 있다.
- 코딩 테스트에서 알고리즘을 한 번 잘못 선택 후 변경하면 시간이 부족해지는 경우가 많았다. 따라서 시간복잡도 계산 후 적합한 알고리즘 선택은 필수!
- 기업 코딩 테스트에서는 제출 시간이나 맞은 테스트 케이스 수를 제외하면, 효율성과 연관된 '처리 시간'으로 점수를 주기도 하는 듯하다.
- 알고리즘 별 시간 복잡도를 잘 알아두자.
참고 : Do It! 알고리즘 코딩 테스트 자바편
728x90
'CS > 알고리즘' 카테고리의 다른 글
투 포인터 (0) | 2023.06.15 |
---|---|
구간 합 (0) | 2023.06.15 |
그리디(Greedy; 탐욕) 알고리즘 (0) | 2023.02.17 |
Java 코딩 테스트 교재 #4 (0) | 2022.09.29 |
Java 코딩 테스트 교재 #3 (0) | 2022.09.21 |