조건문, 반복문, 함수, 입출력에 대해 배워봤다.
이번시간에는 코딩테스트에서 주로 사용하는 라이브러리
가 무엇인지 알아보자.
파이썬의 일부 라이브러리는 잘못 사용하면 수행 시간이 비효율적으로 증가하므로 여기서 작성하는 내용을 잘 기억하자.
표준 라이브러리
란 특정한 프로그래밍 언어에서 자주 사용되는 표준 소스코드를 미리 구현해 놓은 라이브러리를 의미한다.
파이썬 표준 라이브러리는 공식문서에서도 자세히 확인할 수 있다. 추가로 필요한 기능이 있다면 공식문서를 활용하자.
코딩 테스트를 준비하며 반드시 알아야 하는 라이브러리
는 6가지 정도이다. 각 라이브러리
의 가장 중요하고 알아두어야 할 핵심만 먼저 살펴보자.
내장함수:
print()
,input()
과 같은 기본 입출력 기능부터sorted()
와 같은 정렬기능을 포함하고 있는 기본 내장 라이브러리이다.itertools:
반복되는 형태의 데이터를 처리하는 기능을 제공하는 라이브러리이다. 순열과 조합 라이브러리를 제공한다.heapq:
힙(Heap)기능을 제공하는 라이브러리이다. 우선순위 큐 기능을 구현하기 위해 사용한다.bisect:
이진 탐색(Binary Search)기능을 제공하는 라이브러리이다.collections:
덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함하고 있는 라이브러리이다.math:
필수적인 수학적 기능을 제공하는 라이브러리이다.
팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수 관련 함수부터 파이(pi)와 같은 상수를 포함하고 있다.
내장 함수는
import
명령어 없이 바로 사용할 수 있다.
eval(): 해당 수식을 계산한 결과를 반환
result = eval('(3+5) * 7') 👉🏽 56
sorted()
:iterable
객체가 들어왔을 때, 정렬된 결과를 반환
iterable
: [ List ], ( Tuple ), [ Dictionary ]key = lambda a: a[x]
, 원소기준으로 오름 / 내림 차순 정렬가능
sort()
:list iterable
객체는 기본으로sort()
함수 사용 가능
- iterable: [ List ], ( Tuple ), [ Dictionary ]
# sorted ()
data_list = [3, 1, 2, 5]
data_tuple = (3, 1, 2, 5)
data_dict = [('안영우', 26), ('동생1', 23), ('동생2', 13), ('동생3', 11)]
data_dict_key = sorted([('안영우', 26), ('동생1', 23), ('동생2', 13), ('동생3', 11)], key = lambda x: x[1], reverse=True)
print(sorted(data_list))
👉🏽 [1, 2, 3, 5]
print(sorted(data_list, reverse=True))
👉🏽 [5, 3, 2, 1]
print(sorted(data_tuple))
👉🏽 [1, 2, 3, 5]
print(sorted(data_tuple, reverse=True))
👉🏽 [5, 3, 2, 1]
print(sorted(data_tuple))
👉🏽 [('동생1', 23), ('동생2', 13), ('동생3', 11), ('안영우', 26)]
print(sorted(data_tuple), lambda a: a[1])
👉🏽 [('안영우', 26), ('동생1', 23), ('동생2', 13), ('동생3', 11)]
# sort(only list)
data_list = [3, 1, 2, 5]
data_list.sort()
print(data_list)
👉🏽 [1, 2, 3, 5]
permutation()
:list iterable
객체에서r
개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)
combination()
:list iterable
객체에서r
개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우(조합)
from itertools from permutations
from itertools from product
from itertools from combinations_with_replacement
data = ['A', 'B', 'C']
## 순열
data_permutation = list(permutations(data, 2))
👉🏽 [('A', 'B'), ('B', 'A')]
# 순열(중복허용)
data_product = list(product(data, repeat = 2))
👉🏽 [('A', 'A'), ('A', 'B'), ('B', 'A'), ('B', 'B')]
# 조합(중복허용)
data_combination = list(combinations_with_replacement(data, 2))
👉🏽 [('A', 'A'), ('A', 'B'), ('B', 'B')]
heapq()
: 최단 경로 알고리즘을 포함해 다양한 알고리즘에서 우선순위 큐 기능을 구현하는 함수
import heapq
def heapsort(iterable):
h = []
result = []
for value in iterable:
heapq.heappush(h, value)
for i in range(leng(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]
# max_heapq
def max_heapq(iterable):
h = []
result = []
for value in iterable:
heapq.heappush(h, -value)
for i in range(leng(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]
bisect()
:정렬된 배열
에서 특정한 원소를 찾을 때 주로 사용하고배열 위치
를 반환한다.
- bisect_left: 정렬된 순서를 유지하면서 리스트
a
에 데이터x
를 삽입할 가장 왼쪽 인덱스를 찾는 method- bisect_right: 정렬된 순서를 유지하면서 리스트
a
에 데이터x
를 삽입할 가장 오른쪽 인덱스를 찾는 method
예를 들어, 정렬된 리스트 [1, 2, 4, 4, 8]
이 있을 때, 새롭게 데이터 4
를 대입한다고 가정하면
bisect_left(a, 4)
는 2가 될 것이고, bisect_right(a, 4)
는 4가 될 것이다.
from bisect import bisect_left, bisect_right
# 특정한 원소의 배열 위치
a = [1, 2, 4, 4, 8]
print(bisect_left(a, 2))
👉🏽 2
print(bisect_right(a, 4))
👉🏽 4
# 값이 특정 범위에 속하는 원소의 개수
def count_by_range[a, left_value, right_value]:
right_index = bisect_right(a, right_value)
left_index = bisect_left(a, left_value)
return right_index - left_index
a = [ 1, 2, 3, 3, 3, 3, 4, 4, 8, 9]
print(count_by_range(a, 4, 4))
👉🏽 2
print(count_by_range(a, 3, 3))
👉🏽 4
# 0 ~ 9 범위의 데이터 개수
print(count_by_range(a, 1, 9))
👉🏽 10
deque():
Queue
라이브러리는 일반적인 큐 자료구조를 구현하는 라이브러리는 아니다. 따라서,deque()
를 이용해 큐를 구현해야 한다.
from collection import 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]
counter(): 등장 횟수를 세는 기능
list iterable
객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는지 알려준다
from collections import Counter
data_counter = ['red', 'blue', 'blue', 'orange', 'green', 'blue', 'green']
print(Counter(data_counter))
👉🏽 Counter({'blue': 3, 'green': 2, 'red': 1, 'orange': 1})
print(dict(data_counter))
👉🏽 {'red': 1, 'blue': 3, 'orange': 1, 'green': 2}
print(counter['blue'])
👉🏽 3
math(): 수학계산을 요구하는 기능
factorial
,sqrt
,gcd
,pi
,e
등을 계산 할 수 있다.
import math
# factorial(x)
print(math.factorial(5))
👉🏽 120
# sqrt(x): x의 제곱근
print(int(math.sqrt(49)))
👉🏽 7
# gcd(x): 최대 공약수
print(math.gcd(21, 14))
👉🏽 7
# 파이(pi) 출력
print(math.pi)
👉🏽 3.141592653589793
# 자연상수(e) 출력
print(math.e)
👉🏽 2.718281828459045
매일 해뜨기 전 06시 30분에 기상해서 7시부터 약 3시간동안 알고리즘 공부를 했는데 처음에는 정신이 몽롱해지다가 어느샌가 머릿속에 ⚡️ 번개 ⚡️가 치면서 들어올때가 있다.
그럴 때 기분이 좋다.
아직 책의 1/3도 읽지 못했지만 하루하루 꾸준하게 공부하다보면
알고리즘의 개념에 대해 알 수 있지 않을까..?
안녕하세요. 비록 4년이 지난 게시글이긴 하지만,,
max_heapq 예시 코드에서 result부분에 heapsort가 아니라 max_heapq가 되어야할 것 같아서 말씀드립니다!!
게시글 잘 보고 갑니다. 감사합니다~!