읽기와 분석
- 문제를 읽을 때, 어떤 부분을 초점을 두고 읽어야 할까?
- 문제의 조건들을 추상화하는 연습
- 시간복잡도 / 공간복잡도 어림잡기
예제
- 시간, 메모리 제한 확인
- 입력의 범위 확인
시간복잡도
- 어떤 이유로 코드의 실행 시간이 오래 걸릴까? - 연산량
- 계산량은 어떤 값과 상관이 있을까? - 입력
- 입력을 보고 대충 시간을 계산할 수 있을까?
Time Complexity
- 연산에 따라 속도는 모두 같을까?
- +연산, *연산은 같을까?
- 모든 연산을 Counting 할 수 있을까?
- break 등의 생략은?
- 최악과 최선의 경우?
- 수열과 정렬에서의 최악과 최선?
- Counting에 따른 실행시간은?
- 서버와 컴퓨터의 속도차?
Big-O Natation
- 점근적 표기법 - 대충 계산
- 입력이 N일 때, 연산 횟수가 최악이 2N^2 + 4N 이라면
N이 무한대로 커질 때, 증가에 미치는 영향은 가장 큰 항만 필요하다!
계수를 다 떼기 / 뒤의 4N, 앞의 2 - O(N^2)
O(1) 예제
O(N) 예제
O(logN) 예제 - 이분탐색 (=업다운)
- 절반으로 쪼개서 본다. 3등분하여 본다.. 등 균등분을 볼 때 사용
표현법과 감
- Big-O notation은 점근적 표현법
- 시간과 공간 차원에서 각각 다를 수 있음 -> 시간복잡도, 공간복잡도
- 계산 + 시스템에 대한 감이 중요함
- 1초에 천만번 연산 까지는 대다수 가능, 1억 이상이면 불가능에 가깝다.
예제
- 1초 제한에 max(N)=10억 이므로, O(N)이상의 알고리즘은 모두 불가능
읽기와 분석 외전 - 본격적인 PS전 팁
입력과 초기화 팁
Map과 Comprehension
- 입력의 대표적인 사례
- 수 / num = int(input())
- 문자열 ( 문자 배열 ) / string = input() / char_list = list(input())
- 배열 / lst = list(map(int, input().split()))
- map(x,y) 는 x함수를 y원소에 모두 적용한 map 객체를 반환한다.
나중에 char_lst 내용을 문자열로 만들고 싶다면 join 메서드 사용
- map(x,y) 는 x함수를 y원소에 모두 적용한 map 객체를 반환한다.
- List 초기화는 comprehension 으로
- comprehension - 파이썬에서 iterator 한 변수를 만들 때 사용
- lst_1d = [0 for _ in range(N)]
- lst_2d = [[0 for _ in range(N)] for j in range(N)]
에러 메세지
추상화와 기능분리
함수의 활용
가독성
조건문, 반복문, 함수 모두 줄일부분이 존재함
명명법
Snake(변수), Camel(함수), Pascal
'Algorithm > basic' 카테고리의 다른 글
grape/tree/heap/bst (0) | 2021.07.22 |
---|---|
stack/queue/deque (0) | 2021.07.22 |
sort (select/bubble/quick/merge/radix) (0) | 2021.07.22 |
수학 (진수와진법/최대공약수/최소공배수/소인수분해, 재귀함수) (0) | 2021.07.20 |