코딩테스트를 처음 공부하는 분들을 위한 강의 입니다.
★★아래 필수 확인(영상강의,저자소통방,저자카페 링크 있음)★★
유투브 강의 : https://youtu.be/wtBUKpXPN4Q?si=kNdmLgrpQm7xB-j_
저자카톡방 : https://open.kakao.com/o/gX0WnTCf
저자 카페 : https://cafe.naver.com/dremdeveloper
2. ● 책 미리보기(180 페이지 분량)
● 책 구매하기
● 소통할수 있는 톡방
● 깃허브에서 공부하기
● 네이버 카페
저자와 소통하기
3. 유투브 강의와 같이 보세요
https://youtu.be/wtBUKpXPN4Q?si=kNdmLgrpQm7xB-j_
4. 내 코드를 평가하는 방식
- 내가 작성한 코드의 결과값과 테스트 케이스의 결과값이 일치해야함(정확성)
- 문제에서 요구하는 알고리즘 “성능”을 만족해야 함(효율성)
내코드 수행시
간
정답코드 수행
시간
비교
정답코드의 성능과 유사한지 확인해서 정답 처리
=> “성능” 이란 무엇인가?
5. 성능을 측정하는 법 - 시간복잡도의 개념
- 수행시간을 측정하는 법과 연산 횟수를 측정하는 법이 있음.
1 2 3 4 5 6 7 8
배열을 한 번 순회하는 알고리즘의 “성능”은?
입력 출력
코드 동작
관점 1) 절대적인 시간이 어느정도 걸렸나?(성능,환경에 의존적)
관점 2) 코드의 연산이 몇번 됬나? -> 환경의존적이지 않은 방식
시간 복잡도란, 입력값과 연산 횟수의 상관관계에 따라 성능을 측정하는 것
6. 시간 복잡도 측정 - 연산횟수가 항상 일정한 경우
입력 크기 연산 횟수
1 1
2 2
3 3
4 4
5 5
6 6
N N
연산횟수를 그래프로 그려보면
f(x) = x 그래프와 일치
배열을 순회하는 알고리즘의 연산횟수를 N으로 일반화 해보자
=> 입력 값이 N일때 연산횟수가 N번이라고 수 있음, 시간복잡도는 N이다.
7. 시간 복잡도 측정 - 연산횟수가 항상 일정하지 않은 경우
- 각 경우마다 연산횟수가 많이 차이나는 경우가 있음(뭘 기준으로 할 것인가?)
1 2 3 4 5 6 … N
배열에서 내가 원하는 원소를 찾을때 시간복잡도?
경우 연산 횟수
최선의 경우 1
평균적인 경우 N/2
최악의 경우 N 가장 최악의 상황에서도 연산횟수가 N임을 보장함(worst case)
대부분 이정도의 연산횟수임을 보장함(average case)
가장 운이 좋은경우 이 연산횟수가 됨(best case)
제한 시간내에 결과값이 나와야 하는 코딩테스트의 목적과 맞으므로 이를 활용함
8. 시간 복잡도 측정 - 정확한 연산횟수보다 추이(½)
우리 목적은 연산횟수를 정확히 세는게 아니라, 성능의 추이를 파악하고 테스트를
통과할지 판단한는 것 입니다. => 추이만 알아도 충분함. + 추이는 worst case
y = x^3
y = 2x^2
y = x^2 + 3x + 5
이 점부터 항상
solution()의 연산횟수보
다 많음
특정지점부터 항상 내 연산횟수보다 위에있는 함수들 중 하나를 사용하면 된다. 이를 점근적 상한이라고 하고
Big-O로 표한한다.(ex O(X^3), O(2X^2) 모두 가능 그러나 이 들중 무엇을 선택해야 할지 정해야 한다.
9. 시간 복잡도 측정 - 정확한 연산횟수보다 추이(2/2)
여러 점근적 상한중 무엇을 선택할 것인가?
=> 최고차항의 상수및 부호를 떼고, 나머지를 버리면 된다.
y=x^2
y= 3x
y = 5
각 항의 추이를 그리면
최고차항 그래프 값이 나머
지를 무시할 정도로 점점 커
진다!
즉 연산횟수 X^2 + 3X + 5는
점근적 상한으로 표기할 때
O(X^2)으로 쓸 수 있다
* 최고차항 보다 높은 차수의
점근적 상한은 오차가 너무
크므로 의미없다(뒤에서 설
명)
10. 시간 복잡도 - 코딩테스트에서 어떻게 활용할 것인가?(¼)
- 입력값을 보고 가용한 시간복잡도를 고민가능
- 초당 연산횟수를 1,000만 에서 3,000만 이라고 생각하면 됨
11. 시간 복잡도 - 코딩테스트에서 어떻게 활용할 것인가?(2/4)
- 코딩테스트에 주로 등장하는 복잡도
복잡도 사용되는 예시 연산횟수
10 20
O(1) 배열의 인덱스를 통해서 원소접근 1 1
O(logn) 이진탐색 1 1
O(n) 순차탐색 10 20
O(nlogn) 정렬 10 26
O(n^2) 행렬곱셈, 다항식 계산 100 400
O(2^n) 부분집합 구하기, 하노이 1024 1,048,576
O(N!) 순열 생성, 외판원 문제(TSP) 3,628,800 2,432,902,008,176,640,000
복잡도 O(nlogn 미만 그래프)
전체 그래프
12. 시간 복잡도 - 코딩테스트에서 어떻게 활용할 것인가?(¾)
12
선형탐색,O(x)
행렬곱셈O(x^2)
부분 집합,O(2^x)
트리탐색, O(logx)
13. 시간 복잡도 - 코딩테스트에서 어떻게 활용할 것인가?(4/4)
- 문제에 주어지는 입력값으로, 사용가능한 알고리즘 추정 가능
O(N^2) 알고리즘으로 풀면 통과하지 못하겠구나!
정답 코드
복잡한 알고리즘을 생각하지 않고, 그냥 구현하
면 되겠구나!
정답 코드