알고리즘
Insertion vs Merge vs Heap vs Quick
DFS (깊이우선탐색)
모든 노드를 방문할때 이방법을 선택
- 최대한 깊이 내려간 뒤 더이상 깊이 갈 곳이 없을 경우 옆으로 이동
- 다른 노드로 넘어가기 전에 해당 깊이를 완벽하게 탐색
- 경로의 특징을 저장해야 하는 문제에서 유리
- 스택 혹은 재귀함수 이용
DFS
|
|
BFS (너비우선탐색)
두 노드 사이의 최단 거리를 찾을 때 사용
- 최대한 넓게 이동한 다음, 더이상 넓게 갈 수 없을때 아래로 이동
- 미로찾기처럼 최단거리를 구해야하는 경우 유리
- 아래 예시는 큐를 사용
BFS
|
|
GREEDY (탐욕법)
최적의 해를 찾을 수 있을 때 사용
- 시간복잡도에서 우위를 차지할 수 있음
- 가장 큰 순서대로, 가장 작은 순서대로, 평균값부터 접근한다고 문제에서 주어졌을 때
- 최적의 해 (아이디어)가 생각나지 않으면 DP나 Graph로 풀어야한다
BINARY SEARCH (이분탐색)
리스트를 절반씩 나누어가며 탐색하는 알고리즘, 낮은 시간복잡도
- 순차 탐색으로는
O(N)
의 시간 복잡도라면, 이분 탐색은O(log N)
이다. - 리스트의 중간값
mid
의 값이key
보다작으면
좌측은 탐색할 필요가 없으므로left = mid + 1
이된다 left > right
라면 리스트에 원하는 데이터가 없다mid
의 값이key
와 같으면 key값을 찾았기 때문에answer = mid
탐색을 종료
한다.
이분탐색
|
|
이분탐색 재귀
|
|
DIJSTRA (다익스트라)
그래프
에서 노드에서 다른 노드까지최단 경로
를 구하는 알고리즘
출발 노드
와도착 노드
를 설정한다.최단 거리 테이블
을 초기화한다.- 현재 노드의
인접 노드
중방문하지 않은 노드
를 구별하고, 방문하지 않은 노드 중 거리가가장 짧은 노드
를 택하여방문 처리
한다. - 해당 노드를 거쳐 다른 노드로 넘어가는 간선 비용(가중치)을 계산해
최단 거리 테이블
을 업데이트한다. - 3 ~ 4 의 과정을 반복한다.
최단 거리 테이블
은 1차원 배열로, N개 노드까지 오는 데 필요한 최단 거리를 기록. N개(1부터 시작하는 노드 번호와 일치시키려면 N + 1개) 크기의 배열을 선언하고 큰 값을 넣어 초기화시킨다.노드 방문 여부 체크 배열
은 방문한 노드인지 아닌지 기록하기 위한 배열로, 크기는최단 거리 테이블
과 같다. 기본적으로는 False로 초기화하여 방문하지 않았음을 명시한다.간선의 개수
가E
,노드의 개수
가V
일때 시간 복잡도는O(ElogV)
DIJSTRA
|
|
Python 함수
itertools
순열, 조합 사용시 사용하는 함수
combinations
combinations(iterable, r)
: iterable에서 원소 갯수가 r개인 튜플 리턴 (중복 제거)
combinations(iterable, r)
|
|
combinations_with_replacement
combinations_with_replacement(iterable, r)
: iterable에서 원소 갯수가 r개인중복 포함
튜플 리턴
combinations_with_replacement(iterable, r)
|
|
permutations
permutations(iterable, r=None)
: iterable에서 원소 갯수가 r개인 순열 튜플 리턴
permutations(iterable, r=None)
|
|
product
product(*iterables, repeat=1)
: 여러 iterable의 데카르트곱 튜플 리턴
product(*iterables, repeat=1)
|
|
collections
자료형(list, tuple, dict)를 이용할때 확장된 기능을 사용할 수 있는 기본 라이브러리
deque
스택이나 큐를 이용하여 알고리즘 풀때 사용하며 속도가 list 보다 빠르다
. 따라서 push
, pop
을 많이 사용해야하는 문제에서 사용하기 적합하다.
리스트 자료형으로 구현하기 복잡한 것
deque.popleft()
: 데크의 왼쪽 끝 원소 리턴하면서 데크에서 삭제deque.rotate(num)
: 데크를 num만큼 이동한다 (양수면 오른쪽, 음수면 왼쪽)
리스트 자료형으로도 구현하기 쉬운 것
deque.append(item)
: item을 데크의 오른쪽 끝에 삽입 (list append)deque.extend(array)
: 배열을 순회하면서 데크의 오른쪽에 추가 (list extend)deque.extendleft(array)
: 배열을 순회하면서 데크의 왼쪽에 추가 (list extend)deque.appendleft(item)
: item을 데크의 왼쪽 끝에 삽입 (list insert)deque.pop()
: 데크의 오른쪽 끝 원소 리턴하면서 데크에서 삭제 (list pop)deque.remove(item)
: item을 데크에서 삭제 (list del)
Counter
- 리스트가 주어졌을때 중복되지 않는 원소들과 갯수를 딕셔너리 형태로 리턴함
Counter
|
|
defaultdict
- 딕셔너리값의 초기값을 지정할 수 있다. 처음 선언할때 어떤 자료형을 사용할 건지 입력받아야한다.
- keyError 를 우회할 수 있다.
defaultdict
|
|
sort
sorted() vs sort()
sorted(X)
" 원본을 변형시키지 않고 정렬된 리스트를 리턴함X.sort()
: 원본을 변형시켜줌, 리턴값 없음Params
:sort
와sorted
모두 동일한 파라미터를 갖을 수 있다. 파라미터는key
와reverse
가 있으며lambda
와 함께 사용하요 내림차순, 오름차순, 배열의 몇번째 원소 기준으로 정렬할지 정할 수 있다.- 문자는 알파벳순(가나다순), 숫자는 오름차순이 기본
sort
|
|
zip
iterable한 자료형을 순서대로 묶어서 리턴해준다.
- 되도록 zip할 자료형의
갯수
가 같을때 사용 (같지 않을 경우 최소 길이의 자료형으로 리턴한다.) - 자료형은 리스트나 튜플같은 반복 가능한 자료형을 의미한다.
zip
|
|
re
정규식
re.sub(pattern, replacement, string)
: 정규식 패턴과 일치하는 내용을 replacement로 변경\uAC00-\uD7A30
: 모든 한글 음절(가-힣)a-z
: 영어 소문자A-Z
: 영어 대문자0-9
: 숫자\s
: 띄어쓰기
re
|
|
최소공배수, 최대공약수
파이썬
math
라이브러리 이용하면 쉽게 구할 수 있다
최소공배수, 최대공약수
|
|
진수
내장 함수
bin
을 이용하면 쉽게 구할 수 있음.
최소공배수, 최대공약수
|
|