2. 목차
시간 복잡도
- 알고리즘이란?
- 알고리즘 성능측정법 및 시간 복잡도 개념
- 시간 복잡도를 빅오 표기법으로 표기하기
- 코딩 테스트에서 꼭 알아둬야 할 시간 복잡도
- 실전 예시
3. 알고리즘이란?
“유한한 수의 규칙에 따라 구별 가능한 기호들을 조작하여 입력 정수에서 출력 정수를 생성
하기 위한 일반화된 작업을 정의”
- 정밀성 : 변하지 않는 명확한 작업 단계를 가져야 한다.
- 유일성 : 각 단계마다 명확한 다음 단계를 가져야 한다.
- 타당성 : 구현할 수 있고 실용적이어야 한다.
- 입력 : 정의된 입력을 받아들일 수 있어야 한다.
- 출력 : 답으로 출력을 내보낼 수 있어야 한다.
- 유한성 : 특정 수의 작업 이후에 정지해야 한다.
- 일반성 : 정의된 입력들에 일반적으로 적용할 수 있어야 한다.
출저 : https://ko.wikipedia.org/wiki/알고리즘
알고리즘의 성능
4. 알고리즘의 성능은 어떻게 측정할 것인가?
입력 출력
구현된 코드 동작
절대시간측정
연산횟수 측정
5. 알고리즘의 성능은 어떻게 측정할 것인가?(절대시간측정)
출저 : chatGPT
동일한 코드를 수행할 때, 두 개의 PC에서
결과가 같게 나올까요?
PC에서 코드가 수행된 시간이 짧을수록 좋
은 성능이다라고 정의해봅시다.
알고리즘 성능 측정을 위해서는 환경에 제
약을 받지 않는 기준이 있어야 함
6. 알고리즘의 성능은 어떻게 측정할 것인가?(연산횟수 측정 1)
- 코드가 동일하면 연산횟수는 모두 동일하므로 객관적 지표로 사용 가능
입력값이 N일때 연산횟수는
N^2 + 3N + 5로 정의할 수 있음
연산횟수는 환경 영향을 받지 않으나, 입력
값에 따라 달라질수 있으므로 기준 필요
특정 코드의 경우 연산횟수가 입력에 따라
변경될 수도 있는 이 경우는??
7. 알고리즘의 성능은 어떻게 측정할 것인가?(연산횟수 측정 2)
- 입력값에 따른 연산횟수가 일정하지 않은 경우
연산횟수를 구하면…
N이 짝수일때는 N^2, N이 홀수일때는 N
코딩테스트 에서는 제한시간 내에 수행될
수 있는지 확인이 중요함
코테에서는 최악의 경우를 기준으로 연산횟
수를 정하는게 합리적으로 보임
8. 알고리즘의 성능은 어떻게 측정할 것인가?(지금까지 내용 정리)
- 코딩테스트에서 알고리즘의 성능은 연산횟수로 측정
- 입력값에 따라 연산횟수가 상이하다면, 가장 최악의 경우를 기준으로 연산횟수를
측정
- 입력값에 따른 연산횟수를 측정해서 알고리즘의 성능을 지표로 나타내는 것을 시
간 복잡도 라고 함
9. 뭐 더할게 남았나요? 시간복잡도까지 이해했는데
좀 더 생각해 봅시다.
- 코딩테스트에서 이렇게 정밀한 연산횟수를 매번 측정해야 하나요?
=> 점근적 표기법으로 표기
- 그래서 코딩테스트에 시간복잡도를 어떻게 활용해야 하나요?
=> 입력값을 기준으로 가용한 자료구조 및 알고리즘 고려 가능
10. 점근적 표기법(정의를 알아보기 전..)
이전에 봤던 N^2 + 3N + 5의 각 항의 그래프를 따로 그려 봅시다.
N이 커질수록 격차가 커짐
N이 무한이라면?
=> 3N은 N^2에 비해 무시할 정도로 적은 값이 됨
=> 5는 3N에 비해 무시할 정도로 적은 값이 됨
=> N이 크게 되면 앞에 있는 3은 크게 의미가 없음
=> 특정 시점부터 3N은 5보다 항상 큼
=> 특정 시점부터 N^2은 3N보다 항상 큼
코딩테스트는 연산횟수 측정하는 시험 X
어느정도 복잡한지 대략적으로 알면 충분함
N^2 + 3N + 5 대신 N^2이라고 해도 무리 없음
11. 점근적 표기법(정의)
- 정확한 연산횟수가 아닌, 연산횟수의 추이활용해 시간복잡도를 표기
- 이 때 최악의 경우를 고려해서 점근적 표기법으로 나타내는 것을 빅오표기라고 함
방법은 아래와 같이 아주 간단
1. 다항식에서 가장 많이 영향을 미치는 항을 남기고 제거
2. 마지막 남은 항의 계수를 제거
14. 점근적 표기법(자주 보이는 복잡도 2)
이진탐색트리에서 원소 탐색 O(log N)
아래와 같이 매번 탐색대상이 반절로 줄어드는 경우 O(logN)이 됨(머지정렬의 머지, 이진탐색 등….)
15. 점근적 표기법(자주 보이는 복잡도 3)
동전 N개를 던졌을때 경우의수 = O(2^N)
ex)
동전 2개를 던졌을때 경우의수 = 2의 제곱
=> 앞앞
=> 앞뒤
=> 뒤앞
=> 뒤뒤
앞
뒤
앞앞
앞뒤
뒤앞
뒤뒤
16. 점근적 표기법(코딩테스트에 활용하기)
1. 입력값의 크기를 통해 어느정도 시간복잡도 까지 허용되는지 추측 가능
=> 구현시 알고리즘/자료구조 선택을 명확히 할 수 있음
=> 본인이 구현한 코드가 시간초과 발생할 것인지 미리 파악 가능
=> 대략 초당 1,000 ~ 2,000만 정도 연산을 한다고 가정하면 됨
정확한 연산횟수는 중요하지 않습니다. 대
략적으로 파악하면 됩니다.
문제에서 요구하는 성능을 만족할 경우 모
두 정답처리가 되야 하므로 충분히 여유있
게 출제 됩니다.
17. 점근적 표기법(메서드의 시간 복잡도 파악)
동일한 동작을 하는 것처럼 보이나, 시간복잡도가 다른 경우 존재
=> 기본 컨테이너 vs unordered 컨테이너
=> vector와 dictionary/set에서 특정 key 존재유무 확인
=> vector와 list에서 특정위치 원소 가져오기
- 동일한 코드처럼 보이나 코딩테스트 당락을 결정 할 수 있는 중요한 부분
- 직접 코드를 수행해서 확인하세요