[Python] 코딩테스트를 위한 파이썬 문법 03 - 주요 라이브러리의 문법과 유의점
포스트
취소

[Python] 코딩테스트를 위한 파이썬 문법 03 - 주요 라이브러리의 문법과 유의점

본 포스팅은 “이것이 취업을 위한 코딩테스트다 with 파이썬” - (한빛미디어, 나동빈 지음)을 바탕으로 공부한 내용을 정리한 것입니다.

  1. 내장 함수
  2. itertools
    • permutations
    • combinations
    • product
    • combinations_with_replacement
  3. heapq
  4. bisect
  5. collections
    • deque
    • Counter
  6. 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 파이썬” - (한빛미디어, 나동빈 지음)

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.