코딩테스트를 준비하며 반드시 알아야 하는 라이브러리 6가지
- 내장 함수
- print(), input()과 같은 기본 입출력 기능부터 sorted()와 같은 정렬 기능을 포함하고 있는 내장 라이브러리
- itertools
- 파이썬에서 반복되는 형태의 데이터를 처리하는 기능을 제공하는 라이브러리, 순열과 조합 라이브러리를 제공
- heapq
- 힙(Heap) 기능을 제공하는 라이브러리. 우선순위 큐 기능을 구현하기 위해 사용한다.
- bisect
- 이진탐색/이분탐색(Binary Search) 기능을 제공하는 라이브러리
- Collections
- 덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함하고 있는 라이브러리
- math
- 필수적인 수학적 기능을 제공하는 라이브러리
- 팩토리얼, 제곱급, 최대공약수(GCD), 삼각함수, 파이(pi)
내장 함수
문자열에서 리스트로 바꿀 때 arr = str1.split('')로 착각하는데 arr = list(str1)이다.
result = [1,2,3,4,5]
sum(result) #iterable 객체가 들어왔을 때 (반복 가능한 객체) 리스트, 사전자료형, 튜플자료형 등
min(7,3,5,2) # 제일 작은거 반환
max(7,3,5,2) # 제일 큰 거 반환
result = eval("(3+5) * 7")
# 문자열 -> 리스트
str = "python"
my_list = list(str) # ['p','y','t','h','o','n']
# 리스트 -> 문자열 변환
str_list = ['There', 'is', "items"]
result = ' '.join(map(str, str_list)) # There is 4 items
itertools
- 반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리
- permutations (순열)
- combinations (조합)
- product (중복을 허용하는 순열)
- combinations_with_replacement (중복을 허용하는 모든 조합)
- 결과값이 튜플(tuple)로 나온다.
- 순열 조합 모두 클래스이므로 객체 초기화 이후 리스트 자료형으로 변환하여 사용한다.
from itertools import permutations, combinations, product, combinations_with_replacement
data = ['a', 'b', 'c']
# (순열) 2개를 뽑아 나열하는 모든 순열을 출력
result = list(permutations(data,2)) # [('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]
# (조합) 2개를 뽑는 모든 조합 구하기
result = list(combinations(data,2)) # [('a', 'b'), ('a', 'c'), ('b', 'c')]
# (중복 허용 순열) 2개를 뽑는 모든 순열 구하기
result = list(product(data,repeat = 2)) # [('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'b'), ('b', 'c'), ('c', 'a'), ('c', 'b'), ('c', 'c')]
# (중복 허용 조합)2개를 뽑는 모든 조합 구하기
result = list(combinations_with_replacement(data,2)) # [('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')]
heapq (Min heap)
- 힙기능을 위해 heapq 라이브러리를 제공
import heapq
- 다익스트라 최단 경로 알고리즘등에서 우선운위 큐 기능을 구현하고자 할 때 사용
- PriorityQueue 라이브러리를 사용할 수 있지만 코딩테스트 환경에서는 heapq가 더빠르게 동작함으로 heapq를 사용하자
- 최소 힙(min heap)으로 구성되어 있으므로 넣었다 빼는 것만으로 O(NlogN)에 오름차순 정렬이 완료된다.
- 보통 최소 힙 자료구조의 최상단 원소는 항상 '가장 작은'원소이기 때문이다
heapq 생성 : heapq는 생성해서 사용하는 것이 아니라 일반 리스트를 그대로 이용
hq = []
print(hq) # print결과 : []
heapq.heappush( (리스트), (값) ) : 리스트에 Min Heap 기준으로 값 추가
heapq.heappush(hq, 3)
heapq.heappush(hq, 2)
heapq.heappush(hq, 1)
print(hq) # print결과 : deque([1, 3, 2])
heapq.heappop( (리스트) ) : 리스트에서 Min Heap 기준으로 값 삭제 후 반환
print(heapq.heappop(hq)) # print결과 : 1
heapq.heapify( (리스트) ) : 기존 리스트를 Min Heap으로 변환
hq = [3, 5, 4, 1, 2]
heapq.heapify(hq) #[1, 2, 3, 4, 5]
heap으로 max-heap 구현
1. 튜플방식
heapq.heappush(hq, -1)
heapq.heappush(hq, -2)
heapq.heappush(hq, -3)
print(-heapq.heappop(hq)) # print결과 : 3
print(-heapq.heappop(hq)) # print결과 : 2
print(-heapq.heappop(hq)) # print결과 : 1
2. - 추가 방식
heapq.heappush(hq, (-1, 1))
heapq.heappush(hq, (-2, 2))
heapq.heappush(hq, (-3, 3))
print(heapq.heappop(hq)[1]) # print결과 : 3
print(heapq.heappop(hq)[1]) # print결과 : 2
print(heapq.heappop(hq)[1]) # print결과 : 1
힙으로 이중리스트를 정렬은 앞에를 우선 정렬 후 뒤를 정렬한다.
e = [[2, 4],[1, 5], [0, 3], [0, 1]]
heapq.heapify(e) # [[0, 1], [1, 5], [0, 3], [2, 4]]
bisect
- 이진탐색을 쉽게 구현할 수 있도록 하는 라이브러리
- '정렬된 배열'에서 특정한 원소를 찾아야 할 때 매우 효과적으로 사용 <- 꼭 정렬을 해줘야 함
- bisect_left(a,x)
- 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드
- bisect_right(a,x)
- 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드
- '정렬된 리스트'에서 '값이 특정 범위에 속하는 원소의 개수'를 구하고자 할 때 사용
from bisect import bisect_left, bisect_right
a = [1, 2, 4, 4, 8]
print(bisect_left(a, 3)) # 2
print(bisect_right(a, 5)) # 4
collections
1. deque
- double ended queue의 약자로, 양방향 연결리스트(Doubly Linked List)로 구성되어 있다.
- 스택, 큐를 구현할 때 사용하는 라이브러리
- 가장 앞 원소추가, 가장 앞 원소제거에서 O(1)의 시간복잡도를 가진다
- 인덱싱, 슬라이싱 등은 사용할 수 없다.
from collections import deque
data = deque([2,3,4])
data.appendleft(1)
data.append(5)
data.pop()
data.popleft()
print(data)
# deque([2, 3, 4])
print(list(data))
# [2, 3, 4]
2. Counter
- 등장 횟수를 세는 기능을 제공
- 리스트와 같은 iterable 객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는지를 알려준다.
- 원소별 등장 횟수를 세는 기능이 필요할 때 짧은 코드로 이를 구현할 수 있다.
- 리스트의 원소와 원소별 빈도수를 키-값으로 갖는 딕셔너리 반환
- 원소 추가, 삭제, 여러 원소 한번에 추가 모두 가능하다.
from collections import Counter
list = ['Hello', 'HI', 'How', 'When', 'Where', 'Hello']
dic = Counter(list) # Counter({'Hello': 2, 'HI': 1, 'How': 1, 'When': 1, 'Where': 1})
# 한개 삭제
dic['Hello'] -= 1 # Counter({'Hello': 1, 'HI': 1, 'How': 1, 'When': 1, 'Where': 1})
# 한개 추가
dic['asd']+=1 # Counter({'Hello': 1, 'HI': 1, 'How': 1, 'When': 1, 'Where': 1, 'asd': 1})
# 여러개 추가
dic.update(['1','2','3']) # Counter({'Hello': 1, 'HI': 1, 'How': 1, 'When': 1, 'Where': 1, 'asd': 1, '1': 1, '2': 1, '3': 1})
# most_common() : Counter()에서 가장 빈도수가 높은 순으로 표시해 주는 하수 입니다. 단, 인자값으로 숫자를 입력하시면 그 숫자번째까지의 빈도수를 표시해줍니다.
value = "Hello Appia"
countValue = Counter(value)
print(countValue.most_common()) # [('l', 2), ('p', 2), ('H', 1), ('e', 1), ('o', 1), (' ', 1), ('A', 1), ('i', 1), ('a', 1)]
print(countValue.most_common(2) # [('l', 2), ('p', 2)]
3. 사전 자료형의 value를 리스트로 만들고 추가하는 방법
from collections import defaultdict
data = defaultdict(list)
tickets = [[0,0],[1,1],[2,2]]
for ticket in tickets:
data[ticket[0]].append(ticket[1])
math
- 수학적인 기능을 포함하고 있는 라이브러리
- 팩토리얼, 제곱근, 최대공약수(GCD) , Pi
- 반올림은 math 함수에 포함되지 않는다!!
import math
print(math.factorial(5)) # 5 팩토리얼 출력
print(math.sqrt(7)) # 7의 제곱근 출력
print(math.gcd(21,14)) # 21과 14의 최대 공약수 , 7
print(math.pi) # 파이 출력
print(math.e) # 자연상수 출력
math.ceil(5.123) # 소수점 올림
math.floor(5.123) # 소수점 내림
round(5.123) # 소수점 반올림
추가로 최소공배수 만드는법
import math
def lcm(a, b):
return a * b // math.gcd(a, b) #실수로 나오니까 정수로 나오겠끔 //로 나누자
'코딩 테스트 > 코딩테스트 - 학습' 카테고리의 다른 글
정렬 (0) | 2023.01.20 |
---|---|
완전 탐색 (0) | 2023.01.18 |
dfs bfs (0) | 2023.01.14 |
코딩테스트 파이썬 문법 (기초편) (0) | 2023.01.12 |
코딩테스트 준비 (By Python...) (2) | 2023.01.10 |