
| 이름(표기) | 의미 | 시간 복잡도 |
|---|---|---|
| 빅-오메가 ((n)) | 최선일 때(best case)의 연산 횟수를 나타낸 표기법 | 1번 |
| 빅-세타 ((n)) | 보통일 때(average case)의 연산 횟수를 나타낸 표기법 | N/2번 |
| 빅-오 (O(n)) | 최악일 때(worst case)의 연산 횟수를 나타낸 표기법 | N번 |
❗코딩테스트에서는 빅-오 표기법(O(n)) 기준으로 수행 시간을 계산하는 것이 좋다.
→ WHY? 최악일 때(worst case)를 염두에 둬야 하기 때문!
"선형 검색 알고리즘은 배열의 길이가 N일 때 총 N번 검색하는 과정이 필요하다." 라고 말하는 것보다 "선형 검색 알고리즘의 시간 복잡도는 O(N)이다." 라고 말하는 게 더 간단하다.
def print_first(arr):
print(arr[0])
→ 배열의 길이와 상관없이 딱 1번 실행하고 끝난다. 시간 복잡도 O(1)
= '상수 시간(constant time) 내에 실행된다'
⭐상수 시간(constant time) : 이미 실행 횟수가 고정으로 정해진 것
def print_first(arr):
print(arr[0])
print(arr[0])
→ 위의 경우와 마찬가지로 O(1)이라고 표현
def print_first(arr):
for n in arr:
print(n)
→ 배열의 길이에 따라 실행 시간이 달라진다. 시간 복잡도 O(N)
def print_first(arr):
for n in arr:
for x in arr:
print(x, n)
→ (1,1)부터 (100,100)까지 총 10,000번 출력한다. 시간 복잡도 O(N)
연산 횟수 = 알고리즘 시간 복잡도 N값에 데이터의 최대 크기를 대입하여 도출
조건 : 시간 제한 = 2초
⇒ 조건을 만족하려면 2 * 2,000만 번 = 4,000만 번 이하의 연산 횟수로 문제를 해결해야 한다.
버블 정렬(O(N)) = (1,000,000) = 1,000,000,000,000 > 40,000,000 ⇒ 부적합
병합 정렬(O(NlonN)) = 1,000,000log(1,000,000 = 약 20,000,000 < 40,000,000 ⇒ 적합
❗시간 복잡도 분석으로 문제에서 사용할 수 있는 알고리즘을 선택할 수 있고, 데이터의 크기(N)로 사용해야 하는 알고리즘을 추측해볼 수 있다.
① 상수는 시간 복잡도 계산에서 제외한다.
② 가장 많이 중첩된 반복문의 수행 횟수가 시간 복잡도의 기준이 된다.
N = 100000
cnt = 1
for i in range(N):
print("연산 횟수 " + str(cnt))
cnt += 1
N = 100000
cnt = 1
for i in range(N):
print("연산 횟수 " + str(cnt))
cnt += 1
for i in range(N):
print("연산 횟수 " + str(cnt))
cnt += 1
for i in range(N):
print("연산 횟수 " + str(cnt))
cnt += 1
⇒ 두 예제 코드의 연산 횟수는 "3배"
❗코딩 테스트에서는 일반적으로 상수를 무시하기 때문에 두 코드의 시간 복잡도는 O(N)으로 같다!
N = 100000
cnt = 1
for i in range(N):
for j in range(N):
print("연산 횟수 " + str(cnt))
cnt += 1
⭐시간 복잡도는 가장 많이 중첩된 반복문을 기준으로 도출
⇒ 예제3에서는 "이중 for문"이 전체 코드의 시간 복잡도 기준이 된다.
❗일반 for문이 10개 더 있다고 해도 기준 ②에 따라 시간 복잡도는 N으로 유지된다.