표준 라이브러리
특정 프로그래밍 언어에서 자주 사용되는 표준 소스코드를 미리 구현해놓은 라이브러리이다.
C++의 STL(Standard Template Library) 같은거다.
코테를 준비하면서 반드시 알아야하는 라이브러리는 6가지 정도이다. 각 라이브러리의 모든 기능을 다룰수는 없고, 가장 중요한 내용만 일단 알아본다.
- 내장함수 : print(), input()과 같은 기본 입출력 기능, sorted()와 같은 정렬기능 등을 포함.
- Itertools : 파이썬에서 반복되는 형태의 데이터를 처리하는 기능을 제공. 순열과 조합 라이브러리 제공.
- heapq : 힙(Heap) 기능을 제공하는 라이브러리. 우선순위 큐를 위해 사용.
- bisect : 이진 탐색(Binary Search) 기능을 제공하는 라이브러리.
- collections : 덱(Deque), 카운터(Counter) 등의 유용한 자료구조를 포함하는 라이브러리.
- math : 필수적인 수학적 기능을 제공한다. 팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수 등을 포함.
내장함수
별도의 import 명령어 없이 바로 사용할 수 있는 내장함수.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
# sum() : 리스트와 같은 iterable 객체가 입력으로 들어올 때, 모든 원소의 합을 반환.
# iterable : 반복 가능한 객체. 리스트, 사전 자료형, 튜플 자료형 등이 해당.
result = sum([1, 2, 3, 4, 5])
print(result) # 15
# min() : 파라미터가 2개 이상 들어왔을 때, 가장 작은 값을 반환.
result = min([3, 2, 4, 5, 1])
print(result) # 1
# max() : 파라미터가 2개 이상 들어왔을 때, 가장 큰 값을 반환.
result = max([3, 2, 4, 5, 1])
print(result) # 5
# eval() : 수학 수식이 문자열 형식으로 들어오면 해당 수식을 계산한 결과를 반환.
result = eval("(3 + 5) * 7")
print(result) # 56
# sorted() : iterable 객체가 들어왔을 때, 정렬된 결과를 반환.
# key 속성으로 정렬 기준을 명시할 수 있다.
# reverse 속성으로 정렬된 결과를 뒤집을 수 있다.
result = sorted([3, 2, 4, 5, 1])
print(result) # [1, 2, 3, 4, 5]
result = sorted([3, 2, 4, 5, 1], reverse=True)
print(result) # [5, 4, 3, 2, 1]
# 리스트의 원소로 리스트나 튜플이 존재할 때, 특정 기준에 따라 정렬 수행가능.
# key 속성을 이용해 명시한다.
result = sorted([('복숭아', 1), ('자두', 2), ('파인애플', 3)], key=lambda x : x[1], reverse=True)
print(result) # [('파인애플', 3), ('자두', 2), ('복숭아', 1)]
# 리스트와 같은 iterable 객체는 기본으로 sort() 함수를 내장한다.
# sort()를 사용할 경우 리스트 객체 내부 값이 정렬된다.
result = sorted([3, 2, 4, 5, 1])
result.sort()
print(result) # [1, 2, 3, 4, 5]
|
cs |
itertools
반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리.
코테에서 유용하게 사용되는 클래스는 permutations, combinations 이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
from itertools import permutations
from itertools import combinations
from itertools import product
from itertools import combinations_with_replacement
# permutations
# iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)를 계산한다.
data = ['A', 'B', 'C']
result = list(permutations(data, 2))
print(result) # [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
# combinations
# iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)을 계산한다.
data = ['A', 'B', 'C']
result = list(combinations(data, 2))
print(result) # [('A', 'B'), ('A', 'C'), ('B', 'C')]
# product
# permutaions 와 똑같지만, 원소를 중복하여 뽑는다.
data = ['A', 'B', 'C']
result = list(product(data, repeat=2))
print(result) # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
# combinations_with_replacement
# combinations 와 똑같지만, 원소를 중복하여 뽑는다.
data = ['A', 'B', 'C']
result = list(combinations_with_replacement(data, 2))
print(result) # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
|
cs |
heapq
다양한 알고리즘에서 우선순위 큐 기능을 구현하고자 할 때 사용한다.
PriorityQueue 라이브러리도 있지만, 코테 환경에서는 보통 heapq가 빠르게 동작한다고 한다.
파이썬의 힙은 최소 힙(Min Heap) 으로 구성되어 있다.
단순히 원소를 넣다 빼는거만으로도 시간 복잡도 O(NlogN)의 오름차순 정렬이 완료된다.
힙에 원소 삽입 시 heapq.heappush() 메서드를 이용, 원소를 꺼낼 시 heapq.heappop() 메서드를 이용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import heapq
# heapq로 구현한 힙 정렬(Heap sort)
def heapsort(iterable):
h = []
result = []
# 모든 원소를 차례대로 힙에 삽입
for value in iterable:
heapq.heappush(h, value)
# 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
for i in range(len(h)):
result.append(heapq.heappop(h))
return result
result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
print(result) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
cs |
파이썬에서는 최대 힙을 제공하지 않는다.
heapq 라이브러리를 이용하여 최대 힙을 구현 할 경우, 원소의 부호를 임시로 변경하는 방식을 쓴다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import heapq
# heapq로 구현한 내림차순 힙 정렬(Heap sort)
def heapsort(iterable):
h = []
result = []
# 모든 원소를 차례대로 힙에 삽입
for value in iterable:
heapq.heappush(h, -value)
# 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
for i in range(len(h)):
result.append(-heapq.heappop(h))
return result
result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
print(result) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
|
cs |
collections
유용한 자료구조를 제공하는 표준 라이브러리.
코테에서는 deque와 Counter를 유용하게 사용한다.
파이썬에서는 deque을 이용해 queue를 구현 한다.
deque에서는 리스트 자료형과 다르게 인덱싱, 슬라이싱 등의 기능은 사용할 수 없다.
하지만, 연속적으로 나열된 데이터의 시작과 끝 부분에 데이터 삽입, 제거는 매우 효과적으로 사용된다.
리스트 | deque | |
가장 앞쪽에 원소 추가 | O(N) | O(1) |
가장 뒤쪽에 원소 추가 | O(1) | O(1) |
가장 앞쪽에 있는 원소 제거 | O(N) | O(1) |
가장 뒤쪽에 있는 원소 제거 | O(1) | O(1) |
1
2
3
4
5
6
7
8
9
|
from collections import deque
# deque의 이용
data = deque([2, 3, 4])
data.appendleft(1)
data.append(5)
print(data) # deque([1, 2, 3, 4, 5])
print(list(data)) # [1, 2, 3, 4, 5] - 리스트로 변환
|
cs |
Counter는 등장 횟수를 세는 기능을 제공한다.
iterable 객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는지를 알려준다.
1
2
3
4
5
6
7
8
9
10
|
from collections import Counter
counter = Counter([1, 2, 3, 2, 1, 2, 3, 2, 1])
# 1이 등장한 횟수
print(counter[1]) # 3
# 2가 등장한 횟수
print(counter[2]) # 4
# 사전 자료형으로 변환
print(dict(counter)) # {1: 3, 2: 4, 3: 2}
|
cs |
math
자주 사용되는 수학적인 기능을 포함하고 있는 라이브러리.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import math
# 5 팩토리얼 출력
print(math.factorial(5)) # 120
# 4의 제곱근을 출력
print(math.sqrt(4)) # 2
# 21과 14의 최대 공약수를 출력
print(math.gcd(21, 14)) # 7
# 파이 출력
print(math.pi) # 3.141592653589793
# 자연상수 e 출력
print(math.e) # 2.718281828459045
|
cs |