기록방
Java 코딩 테스트 교재 #1 본문
1장 : 어떤 알고리즘으로 풀어야할까?
💡 알고리즘 선택의 기준이 되는 시간 복잡도
코딩 테스트의 핵심 중 하나는 시간 복잡도를 고려해 적절한 알고리즘을 선택하는 것
01-1 시간 복잡도 표기법 알아보기
시간복잡도 : 주어진 문제를 해결하기 위한 연산 횟수 (일반적으로 1억번 연산을 1초로 간주해서 예측)
시간 복잡도 유형
- 빅-오메가(Ω(n)) : 최선일 때(best case)의 연산 횟수를 나타낸 표기법
- 빅-세타(Θ(n)) : 보통일 때(average case)의 연산 횟수를 나타낸 표기법
- 빅-오(O(n)) : 최악일 때(worst case)의 연산 횟수를 나타낸 표기법
- ⇒ 코딩 테스트에서는 빅-오 표기법을 기준으로 수행 시간을 계산 (최악을 염두)
01-2 시간 복잡도 활용하기
- 버블 정렬 : O(n^2)
- 병합 정렬 : O(nlogn)
[연습문제 #000 : 수 정렬하기 (boj_2750)]
n 개의 수를 오름차순 정렬한다 (책에서 n은 1~1,000,000 , 사이트는 1~1,000)
- 제한시간 2초 : 2억번 이하의 연산 횟수로 해결
- 연산 횟수 = 알고리즘 시간 복잡도 * 데이터의 크기
- 버블 정렬 = (1,000,000)$^2$ = 1,000,000,000,000 > 200,000,000 ⇒ 부적합 알고리즘
- 병합 정렬 = 1,000,000log(1,000,000) = 약 20,000,000 < 200,000,000 ⇒ 적합 알고리즘
시간 복잡도를 바탕으로 코드 로직을 개선
시간 복잡도 검출 기준
- 상수는 시간 복잡도 계산에서 제외한다.
- 가장 많이 중첩된 반복문의 수행 횟수가 시간 복잡도의 기준이 된다.
- ex) 입력이 N일때 for문으로 0~N 반복
- for문이 1개 : 연산 횟수 N ⇒ O(N)
- for문이 3개 : 연산 횟수 3N ⇒ O(N)
- 상수를 무시하므로 시간 복잡도가 같다
- for문 2개를 중첩 : 연산 횟수 N$^2$ ⇒ O(N$^2$)
- 일반 for문이 더 있다더라도 시간 복잡도는 가장 많이 중첩 된 for문이 기준이다
- ex) 입력이 N일때 for문으로 0~N 반복
작성한 코드에 시간복잡도를 도출할 수 있다면, 실제 코딩 테스트에서 시간 초과가 발생했을 때 문제가 되는 부분을 도출 할 수 있고, 연산에 더욱 효율적인 구조로 수정하는 작업으로 문제를 해결할 수 있다.
728x90
'CS > 알고리즘' 카테고리의 다른 글
Java 코딩 테스트 교재 #3 (0) | 2022.09.21 |
---|---|
Java 코딩 테스트 교재 #2 (0) | 2022.09.20 |
정렬 - 버블 정렬(Bubble Sort) (0) | 2021.04.26 |
정렬 - 삽입정렬(Insertion Sort) (0) | 2021.04.26 |
정렬 - 선택정렬(Selection Sort) (0) | 2021.04.26 |