코딩테스트를 준비하면서 알아야하는 python 라이브러리를 정리해보려 한다. (+ 자료구조 설명 살짝 추가!)
기본 함수
정렬
from itertools import permutations, combinations, product, combinations_with_replacement
data_list = ['A', 'B', 'C']
result = list(permutations(data_list, 3)) # 모든 순열
print(result)
result = list(combinations(data_list, 2)) # 2개를 뽑는 모든 조합
print(result)
result = list(product(data_list, repeat=2)) # 2개를 뽑는 모든 순열 구하기 (중복 허용)
print(result)
result = list(combinations_with_replacement(data_list, 2)) # 2개를 뽑는 모든 조합 (중복 허용)
print(result)
# 결과
[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
[('A', 'B'), ('A', 'C'), ('B', 'C')]
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
힙(Heap)은 특정한 규칙을 가지는 트리로, 최댓값과 최솟값을 찾는 연산을 빠르게 하기 위해 고안된 완전 이진트리를 기본으로 함.
heap property : A가 B의 부모노드이면 A의 키 값과 B의 키 값 사이에는 대소관계가 성립한다.
-- 최소힙 : 부모노드의 키 값이 자식 노드의 키 값 보다 항상 작은 힙
-- 최대힙 : 부모노드의 키 값이 자식 노드의 키 값 보다 항상 큰 힙
(출처 : https://www.geeksforgeeks.org/heap-data-structure/minheapandmaxheap/)
이러한 속성으로 인해 힙에서는 가장 낮은(혹은 높은) 우선순위를 가지는 노드가 항상 루트에 오게 되고, 이를 이용해 우선순위 큐와 같은 추상적 자료형을 구현할 수 있다.
이때, 키 값의 대소관계는 부모/자식 노드 간에만 성립, 형제 노드 사이에는 대소관계가 정해지지 않음
파이썬 heapq 모듈은 heapq (priority queue) 알고리즘을 제공한다.
다익스트라 최단 경로 알고리즘 등에서 우선순위 큐 기능을 구현하고자 할 때 사용한다.
- PriorityQueue 라이브러리를 사용할 수 있지만 코딩테스트 환경에서는 heapq가 더빠르게 동작함으로 heapq를 사용한다고 한다.
최소 힙으로 구성되어 있으므로 넣었다 빼는 것만으로 O(NlogN)에 오름차순 정렬이 완료된다.
최소 힙을 사용하면 원소들이 항상 정렬된 상태로 추가되고 삭제되며, min heap에서 가장 작은값은 언제나 인덱스 0, 즉, 이진 트리의 루트에 위치한다.
내부적으로 최소 힙 내의 모든 원소(k)는 항상 자식 원소들(2k+1, 2k+2) 보다 크기가 작거나 같도록 원소가 추가되고 삭제된다.
힙 함수
from bisect import bisect_left, bisect_right
A = [1,1,2,3,5,7,8]
print(bisect_left(A, 5)) # 4
print(bisect_right(A, 5)) # 5
## 응용 : 특정 범위에 속하는 원소의 개수 구하기
def CountsByRange(nums, left, right) :
right_range = bisect_right(nums, right)
left_range = bisect_left(nums, left)
return right_range-left_range
print(CountsByRange(A, -1, 4)) # 4
from collections import Counter
cnt = Counter(["hi", "hey", "hi", "hi", "hello", "hey"])
print(cnt)
>>> Counter({'hi': 3, 'hey': 2, 'hello': 1})
import math
print(math.sqrt(5)) # 제곱근
print(math.factorial(5)) # 팩토리얼
print(math.gcd(35,14)) # 최대공약수
print(math.pi) # pi
print(math.e) # 자연상수 e
# 내림
print(math.floor(3.14)) # 결과 : 3
print(math.floor(-3.14)) # 결과 : -4
# 올림
print(math.ceil(3.14)) # 결과 : 4
print(math.ceil(-3.14)) # 결과 : -3
# 반올림 -> 파이썬 내장함수 round()를 사용한다.
print(round(3.1415)) # 결과 : 3
print(round(3.1415, 2)) # 결과 : 3.14
print(round(31.415, -1)) # 결과 : 30.0
reduce(집계 함수, 순회 가능한 데이터[, 초기값])