2022-02-09 이것이 코딩테스트이다 2일차 - 1

부록 A - 주요 라이브러리

주요 라이브러리의 문법과 유의점

  • 내장 함수 - print(), input(), 과 같은 기본 기능부터 sorted()등
  • itertools: 파이썬에서 반복되는 형태의 데이터를 처리하는 기능
  • heapq: 힙 기능을 제공하는 라이브러리다. 우선순위 큐 기능 구현위해 사용
  • bisect: 이진 탐색기능을 제공하는 라이브러리이다
  • collections: 덱, 카운터 등의 자료구조를 포함하는 라이브러리
  • math: 필수적인 수학적 기능을 제공하는 라이브러리

내장 함수

#sum()함수 - 리스트같은 객체가 입력으로 주어졌을 때 모든 원소의 합
result = sum([1, 2, 3, 4, 5])
print(result)

#min() - 파라미터가 2개 이상일때 가장 작은 값을 반환
result = min(7, 3, 5, 2) - # = 2

#max() - 가장 큰 값 반환

#eval() - 수학 수식이 문자열 형식으로 들어오면 해당수식 계산한 결과 반환
result = eval("(3+5)*7")

#sorted() - iterable 객체가 들어왔을 때 정렬된 결과를 반환한다.

itertools

  • 반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리
  • 유용하게 사용할 수 있는 클래스는 permutations, combinations
#permutations - iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)를 계산해준다.
from itertools import permutations, combinations, product

data = ['A', 'B', 'C']
result = list(permutations(data, 3)) #모든 순열 구하기 (3개), (3개)

#combinations - iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우를 계산
result = list(combinations(data, 2)) #[(A, B), (A, C), (B, C)] - #순서없음

#product - iterable객체에서 r개의 데이터를 뽑아 일렬로 나열하는 경우의수
result = list(product(data, repeat=2)) #[(AA)(AB)(AC)(BA) ........]
#combinations_with_replacement - 순서를 고려하지 않지만 중복 허용

heapq

  • 힙 기능을 위한 라이브러리
  • 최소 힙으로 구성되어 있어 단순히 넣었다가 빼는 것만으로 정렬이 완료된다.
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))

result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0]) - #01234567789

bisect

  • 이진 탐색을 쉽게 구현할 수 있는 라이브러리
  • 정렬된 배열에서 특정 원소를 찾아야 할 때 매우 효과적
  • bisect_left(), bisect_right()가 가장 중요 O(logN)으로 동작
  • bisect_left(a, x) - 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드
  • bisect_right(a, x) - 정렬된 순서를 유지하도록 리스트 a 에 데이터 x를 삽입 할 가장 오른쪽 인덱스를 찾는 메서드
from bisect import bisect_right, bisect_left

a = [1, 2, 4, 4, 8]
x = 4

print(bisect_left(a, x)#왼쪽들어갈 위치인 2 반환
print(bisect_right(a, x)#오른쪽 위치인 4 반환
  • 특정 범위에 속하는 원소의 개수
from bisect import bisect_left, bisect_right

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)#4왼쪽인덱스인 6, 4오른쪽인덱스은 8, (8-6)로 2반환
print(count_by_range(a, -1, 3)#6 - 0으로 6 반환

collections

  • 유용한 자료구조를 제공하는 표준 라이브러리 - deque, Counter

deque - 이걸 사용해 큐를 구현

  • 디큐에서는 리스트와는 다르게 인덱싱 슬라이싱 등의 기능을 사용할 수 없지만 데이터의 시작 부분이나 끝 부분에 데이터를 삽입하거나 삭제할 때는 매우 효과적으로 사용할 수 있다
  • popleft() 사용해 첫번째 원소 제거 - 마지막 원소는 pop()
  • 첫번째로 삽입은 appendleft() - 마지막에 삽입 append()
  • 따라서 deque를 큐로 사용할 때, 원소를 삽입할 때에는 append(), 삭제할 때에는 popleft()를 사용해 구현
from collections import deque

data = deque([2, 3, 4])
data.appendleft(1)
data.appemd(5)
#[1, 2, 3, 4, 5]

  • Counter
  • 등장 횟수를 세는 기능
  • iterable객체가 주어졌을 때, 내부의 원소가 몇번씩 등장했는지를 알려준다
from collection import Counter

counter = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
print(counter['blue']) #3
print(counter['green']) #1
print(dict(counter)) #딕셔너리 자료형으로 변환

math

  • 자주 사용되는 수학적인 기능을 포함하고 있는 라이브러리 - 팩토리얼, 제곱근, 최대공약수 등 지원
import math

print(math.factorial(5)) # 5! 출력

print(math.sqrt(7)) #루트7 출력

print(math.gcd(21, 14)) #21과 14의 최대공약수
Written on February 9, 2022