본 포스팅은 “이것이 취업을 위한 코딩테스트다 with 파이썬” - (한빛미디어, 나동빈 지음)을 바탕으로 공부한 내용을 정리한 것입니다.
- 내장 함수
- itertools
- permutations
- combinations
- product
- combinations_with_replacement
- heapq
- bisect
- collections
- deque
- Counter
- math
표준 라이브러리란 특정한 프로그래밍 언어에서 자주 사용되는 표준 소스코드를 미리 구현해 놓은 라이브러리를 의미한다.
https://docs.python.org/ko/3/library/index.html
코딩테스트에서 보통 6가지정도를 사용한다고 한다. 해당 포스팅은 이 중 핵심내용으로 책과 유튜브 강의 등에서 언급된 내용들이다.
1. 내장 함수
기본 입출력 기능부터 정렬 기능까지 포함한 내장 라이브러리. 별도의 import
명령어 없이 사용 가능하다.
sum() | 모든 원소 합. iterable 객체를 입력 | sum([1,2,3,4,5]) |
min() | 최소 값 | min(7,3,5,2) |
max() | 최대 값 | max(7,3,5,2) |
eval() | 문자열 형식의 수식 계산 | eval("(3+5) * 7") |
sorted() | 정렬. iterable 객체를 입력. key 속성으로 정렬 기준 명시 | sorted([9,1,8,5,4]) |
sorted(,reverse = True) | reverse 속성으로 정렬 결과를 내림차순으로 변경 | sorted([9,1,8,5,4],reverse=True) |
sorted()
를 사용할 때, 리스트의 원소로 리스트나 튜플이 존재할 때 특정 기준에 따라 정렬 수행 가능하다.
기준은 key 속성으로 명시 가능하다. 다음은 예시이다.
1
2
3
4
# 튜플의 두번째 원소를 기준으로 내림차순 정렬하기
result = sorted([('홍길동',35), ('이순신',75), ('아무개',50)], key = lambda x : x[1], reverse = True)
print(result)
# [('이순신',75),('아무개',50),('홍길동',35)]
리스트와 같은 iterable 객체는 기본으로 sort()
메서드를 내장하고 있다.
1
2
3
4
data = [9,1,8,5,4]
data.sort()
print(data)
# [1,4,5,8,9]
2. itertools
파이썬에서 반복되는 데이터를 처리하는 기능을 포함한 라이브러리이다.
permutations
순열 계산이다.
iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우.
1
2
3
4
data = ['A','B','C']
from itertools import permutations
list(permutations(data,3))
# data에서 3개를 뽑는 모든 순열 구하기
combinations
조합 계산이다.
iterable 객체에서 r개의 데이터를 뽑아 순서 고려하지 않고 나열하는 모든 경우.
1
2
3
4
data = ['A','B','C']
from itertools import combinations
list(combinations(data,2))
# 2개를 뽑는 모든 조합 구하기
product
중복 순열 계산이다.
iterable 객체에서 r개의 데이터를 중복가능하게 뽑아 일렬로 나열하는 모든 경우.
1
2
3
4
data = ['A','B','C']
from itertools import product
list(product(data,repeat=2))
# data에서 2개를 뽑는 모든 중복 순열 구하기
combinations_with_replacement
중복 조합 계산이다.
iterable 객체에서 r개의 데이터를 중복가능하게 뽑아 순서 고려하지 않고 나열하는 모든 경우.
1
2
3
4
data = ['A','B','C']
from itertools import combinations_with_replacement
list(combinations_with_replacement(data,2))
# 2개를 뽑는 모든 중복 조합 구하기
3. heapq
힙 기능을 위해 제공하는 라이브러리다. 다익스트라 최단 경로 알고리즘을 포함해 우선순위 큐 기능 구현에 사용된다.
PriorityQueue 라이브러리도 사용할 수 있지만 코딩 테스트 환경에서는 heapq가 더 빠르다고 한다.
1
2
3
import heapq
heapq.heappush() # 힙에 원소 삽입
heapq.heappop() # 힙에서 원소 꺼냄
파이썬의 힙은 최소 힙으로 구성되어 있다.
힙 정렬
다음은 힙 정렬을 heapq로 구현하는 예제이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 힙정렬 구현
import heapq
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]
파이썬에서는 최대 힙을 제공하지 않기에 원소 부호를 임시로 변경하는 방식을 사용한다.
다음은 최대 힙을 구현하여 오름차순 힙 정렬을 구현하는 예제이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
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]
4. bisect
이진 탐색을 쉽게 구현할 수 있도록 제공하는 라이브러리다.
정렬된 배열에서 특정한 원소를 찾아야 할 때 매우 효과적이다.
bisect_left(a,x) | 정렬된 순서 유지하며 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드 |
bisect_right(a,x) | 정렬된 순서를 유지하도록 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드 |
1
2
3
4
5
6
7
# 예시
a = [1,2,4,4,8]
x = 4
from bisect import bisect_left, bisect_right
bisect_left(a,x) # 2
bisect_right(a,x) # 4
활용
값이 특정 범위에 속하는 원소의 개수를 구할 때
1
2
3
4
5
6
7
8
9
10
11
12
from bisect import bisect_left, bisect_right
# 값이 [left_value, right_value]인 데이터 개수 반환
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]
# 값이 4인 데이터 개수 출력
print(count_by_range(a,4,4)) # 2
# 값이 [-1,3] 범위에 있는 데이터 개수 출력
print(count_by_range(a,-1,3)) # 6
5. collections
deque
큐를 구현할때 사용한다. Queue 라이브러리가 따로 있지만 일반적인 큐 자료구조를 구현하는 라이브러리가 아니라고한다.
- deque는 리스트와 다르게 인덱싱, 슬라이싱 등 사용불가
- 대신 연속적 나열 데이터의 시작/끝에 유리
- 스택/큐의 대용으로 사용 가능
1
2
3
4
5
from collections deque
deque.popleft() # 첫번째 원소 제거
deque.pop() #마지막 제거
deque.appendleft(x) # 첫번째에 삽입
deque.append(x) # 마지막에 삽입
Counter
등장 횟수를 세는 기능을 제공한다.
iterable 객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는지를 알려준다.
1
2
3
4
5
# 예시
from collections import Counter
counter = Counter(['red','blue','red',
'green','blue','blue'])
# {'red':2, 'blue':3, 'green':1}
6. math
자주 사용되는 수학적인 기능을 포함하고 있는 라이브러리이다.
math.factorial() | 팩토리얼 |
math.sqrt() | 제곱근 |
math.gcd(a,b) | 최대공약수 |
math.pi | 파이(pi, 3.14…) |
math.e | 자연상수 e |
참고
“이것이 취업을 위한 코딩테스트다 with 파이썬” - (한빛미디어, 나동빈 지음)
- 자료 주소: http://www.hanbit.co.kr/src/10307/
- 저자 깃허브 주소: http://github.com/ndb796
- 동영상 주소: http://youtube.com/user/HanbitMedia93