일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- MACD
- ccxt
- RSI
- behavioral pattern
- adx
- 볼린저 밴드
- frontend
- 변동성 기반 지표
- 추세 기반 지표
- pyQT
- Flutter
- 어댑터 패턴
- design pattern
- 모멘텀 기반 지표
- 플러터
- 티스토리챌린지
- next.js
- 소프트웨어공학
- ai
- LLM
- 행동패턴
- Design Patterns
- pyqt6
- 디자인패턴
- front-end
- 오블완
- Python
- 구조패턴
- 디자인 패턴
- 비트코인
변혁적인 삶
[Python] 코딩 테스트 필수 표준 라이브러리 소개 본문

📚 [Python] 코딩 테스트 필수 표준 라이브러리 소개
목차
- 개요
- 1. collections
- 1.1 Counter
- 1.2 deque
- 1.3 defaultdict
- 2. heapq
- 2.1 min-heap
- 2.2 max-heap
- 3. itertools
- 3.1 permutations
- 3.2 combinations
- 3.3 product
- 4. bisect
- 5. math
- 6. functools
- 6.1 lru_cache
- 6.2 reduce
- 7. datetime
- 결론
개요
Python에는 코딩 테스트에서 유용한 강력한 표준 라이브러리가 있습니다.
이 글에서는 Python 코딩 테스트에서 필수적인 표준 라이브러리와 그 사용법을 살펴보겠습니다.
1. collections
1.1 Counter
Counter 클래스는 문자열이나 리스트에서 각 요소의 빈도(횟수)를 세어주는 데이터 구조입니다.
주어진 데이터에서 각 요소가 몇 번 등장하는지를 쉽게 알 수 있어, 빈도 계산이 필요한 경우 매우 유용합니다.
- 문자열, 리스트 등을 Counter에 전달하면 각 요소의 개수가 자동으로 계산되어 저장됩니다.
- Counter 객체는 요소별 등장 횟수를 딕셔너리 형태로 반환합니다.
예제 코드
from collections import Counter
text = "hello world"
counter = Counter(text)
print(counter)
출력
Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
설명
위 예제에서 Counter는 문자열 text에서 각 문자의 등장 횟수를 세고, 그 결과를 딕셔너리 형태로 반환합니다.
예를 들어, l은 3번, o는 2번 등장했으며, 나머지 문자는 각각 1번씩 등장합니다.
1.2 deque
deque는 양쪽 끝에서 빠르게 삽입과 삭제가 가능한 자료 구조입니다.
리스트와 유사하지만, 큐(queue)와 스택(stack) 모두의 기능을 제공하여 효율적으로 사용할 수 있습니다.
특히, 양쪽 끝에서의 작업이 빈번한 경우에 deque는 리스트보다 빠른 성능을 보입니다.
- append(): 오른쪽 끝에 값을 추가합니다.
- appendleft(): 왼쪽 끝에 값을 추가합니다.
- pop(): 오른쪽 끝에서 값을 제거하고 반환합니다.
- popleft(): 왼쪽 끝에서 값을 제거하고 반환합니다.
예제 코드
from collections import deque
dq = deque([1, 2, 3]) # 초기 deque 생성
dq.append(4) # 오른쪽 끝에 4 추가
dq.appendleft(0) # 왼쪽 끝에 0 추가
dq.pop() # 오른쪽 끝 값 제거 (4 제거)
dq.popleft() # 왼쪽 끝 값 제거 (0 제거)
print(dq)
출력
deque([1, 2, 3])
설명
위 예제에서는 deque를 생성하고 여러 가지 삽입과 삭제 연산을 수행합니다.
최종적으로 dq는 [1, 2, 3] 형태로 남게 됩니다.
1.3 defaultdict
defaultdict는 키가 존재하지 않을 때 자동으로 기본값을 설정해 주는 딕셔너리입니다.
일반적인 딕셔너리와 달리, defaultdict를 사용하면 키가 없을 때 에러 없이 기본값을 반환하도록 설정할 수 있습니다.
- defaultdict(int)를 사용하면 키가 존재하지 않을 때 기본값으로 0이 자동으로 설정됩니다.
- 특정 키의 값에 바로 접근하여 연산할 수 있으므로 편리합니다.
예제 코드
from collections import defaultdict
dd = defaultdict(int) # int를 기본값으로 설정
dd["a"] += 1 # 키 'a'의 값에 1을 더함 (기본값 0에서 시작)
print(dd["a"]) # 출력: 1
설명
위 예제에서 "a"라는 키가 없었지만, defaultdict(int) 덕분에 자동으로 0이 기본값으로 설정됩니다. 이후 "a"의 값에 1을 더하므로 최종적으로 "a"의 값은 1이 됩니다.
2. heapq
heapq는 최소 힙 자료구조를 지원하는 모듈로, 우선순위 큐를 구현할 때 유용합니다.
2.1 min-heap(최소 힙)
heapq 모듈을 사용하면 Python에서 쉽게 최소 힙을 구현할 수 있습니다. 최소 힙에서는 가장 작은 값이 항상 먼저 나오게 되어, 작은 숫자부터 정렬된 순서로 값을 뽑아낼 수 있습니다.
예제 코드
# 최소 힙 예제 코드
import heapq
heap = []
# for문을 실행하고 나면 heap은 [1, 2, 3, 4, 5]로 정렬된 최소 힙이 된다.
for i in range(1, 6):
heapq.heappush(heap, i)
# 작은 숫자 순서대로 1, 2, 3, 4, 5가 출력된다.
for i in range(5):
print(heapq.heappop(heap))
설명
- 빈 리스트를 선언하고 heapq.heappush() 메소드를 통해 값을 추가합니다.
- heappush()는 리스트가 힙 정렬되도록 값을 삽입하여 자동으로 최소 힙 구조를 유지하게 합니다.
2.2 max-heap(최대 힙)
heapq는 기본적으로 최대 힙을 제공하지 않지만, 부호를 바꾸는 방법으로 최대 힙을 구현할 수 있습니다.
예제 코드
# 최대 힙 예제 코드
import heapq
heap = []
values = [1, 5, 3, 2, 4]
# 모든 값을 음수로 바꿔서 최소 힙에 넣음. heap은 [-5, -4, -3, -1, -2] 형태가 된다.
for value in values:
heapq.heappush(heap, -value)
# 큰 숫자 순서대로 5, 4, 3, 2, 1이 출력된다.
for i in range(5):
print(-heapq.heappop(heap))
설명
- 값을 음수로 바꿔 최소 힙에 넣습니다. heapq는 최소 힙이므로, 음수로 넣은 값 중 절대값이 가장 큰 값이 먼저 나오게 됩니다.
- 값을 꺼낼 때 -를 붙여 원래 값으로 되돌리면 가장 큰 값부터 출력되므로, 최대 힙과 동일하게 동작합니다.
3. itertools
3.1 permutations & combinations
itertools 모듈의 permutations와 combinations는 순열과 조합을 쉽게 생성할 수 있는 기능을 제공합니다.
모든 경우의 수를 구하거나 다양한 조합을 만들어야 할 때 유용합니다.
- permutations(data, r): 순열을 생성합니다. 데이터에서 r개의 요소를 선택하여 순서대로 나열하는 모든 경우의 수를 구합니다.
- combinations(data, r): 조합을 생성합니다. 데이터에서 r개의 요소를 선택하여 순서와 관계없이 나열하는 모든 경우의 수를 구합니다.
예제 코드
from itertools import permutations, combinations
data = [1, 2, 3]
print(list(permutations(data, 2))) # 출력: [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
print(list(combinations(data, 2))) # 출력: [(1, 2), (1, 3), (2, 3)]
설명
- permutations(data, 2): [1, 2, 3]에서 2개씩 선택해 순서대로 나열한 모든 경우의 수를 반환합니다. (1, 2), (1, 3), (2, 1) 등 순서가 다른 경우도 별도로 생성됩니다.
- combinations(data, 2): [1, 2, 3]에서 2개씩 선택한 조합을 반환하며, (1, 2), (1, 3), (2, 3)처럼 순서와 상관없이 구성됩니다.
3.2 product
product 함수는 데카르트 곱을 계산하여 여러 리스트의 모든 가능한 조합을 생성합니다.
두 개 이상의 리스트에서 하나씩 값을 선택하여 가능한 모든 조합을 만들 때 유용합니다.
- product(data1, data2): data1과 data2에서 각각 하나씩 선택해 모든 경우의 수를 생성합니다.
- 각각의 요소가 조합된 모든 경우의 수가 튜플 형태로 반환됩니다.
예제 코드
from itertools import product
data1 = [1, 2]
data2 = ['A', 'B']
print(list(product(data1, data2))) # 출력: [(1, 'A'), (1, 'B'), (2, 'A'), (2, 'B')]
설명
- product(data1, data2)는 data1에서 하나, data2에서 하나씩 선택해 가능한 모든 조합을 생성합니다.
- (1, 'A'), (1, 'B'), (2, 'A'), (2, 'B')와 같이 모든 가능한 경우의 수를 구해 결과를 리스트로 반환합니다.
4. bisect
bisect 모듈은 이진 탐색을 사용하여 정렬된 리스트에 값을 삽입할 위치를 빠르게 찾는 기능을 제공합니다. bisect_left와 bisect_right를 사용하면 특정 값이 들어갈 왼쪽 또는 오른쪽 위치를 쉽게 찾을 수 있습니다.
- bisect_left(data, x): x가 들어갈 가장 왼쪽 위치를 반환합니다. 이미 x가 리스트에 존재하면 그 왼쪽 위치를 반환합니다.
- bisect_right(data, x): x가 들어갈 가장 오른쪽 위치를 반환합니다. 이미 x가 리스트에 존재하면 그 오른쪽 다음 위치를 반환합니다.
예제 코드
import bisect
data = [1, 2, 3, 3, 4, 7]
# bisect_left - 3이 들어갈 가장 왼쪽 위치 찾기
left_position = bisect.bisect_left(data, 3)
print(left_position) # 출력: 2
# bisect_right - 3이 들어갈 가장 오른쪽 위치 찾기
right_position = bisect.bisect_right(data, 3)
print(right_position) # 출력: 4
설명
- bisect_left(data, 3):
- data 리스트에서 3이 들어갈 가장 왼쪽 위치인 2를 반환합니다. 이 위치에 3을 삽입하면 리스트는 [1, 2, 3, 3, 3, 4, 7]이 됩니다.
- bisect_right(data, 3):
- data 리스트에서 3이 들어갈 가장 오른쪽 위치인 4를 반환합니다. 이 위치에 3을 삽입해도 [1, 2, 3, 3, 3, 4, 7] 형태로 정렬 상태가 유지됩니다.
차이점
- bisect_left는 가장 왼쪽에, bisect_right는 가장 오른쪽 다음 위치에 삽입하는 데 유용합니다.
- 중복된 값이 있을 경우, bisect_left는 가장 첫 위치, bisect_right는 중복된 값의 마지막 위치 다음을 반환합니다.
5. math
math 모듈은 수학적인 계산을 효율적으로 수행할 수 있는 다양한 함수를 제공합니다.
코딩 테스트에서 자주 사용되는 주요 함수는 다음과 같습니다.
- math.gcd(a, b): 두 숫자 a와 b의 최대공약수(GCD)를 구합니다.
- math.factorial(n): 숫자 n의 팩토리얼(factorial)을 계산합니다.
- math.sqrt(x): 숫자 x의 제곱근을 구합니다. 결과는 부동소수점(float)으로 반환됩니다.
- math.isqrt(x): 숫자 x의 정수 제곱근을 구합니다. 소수점 아래 값은 버리고 정수로 반환됩니다.
- math.pow(x, y): x의 y 거듭제곱(제곱, 세제곱 등)을 계산합니다. 결과는 부동소수점(float)으로 반환됩니다.
예제 코드
import math
# 최대공약수 구하기
print(math.gcd(12, 18)) # 출력: 6
# 팩토리얼 계산
print(math.factorial(5)) # 출력: 120
# 제곱근 계산
print(math.sqrt(16)) # 출력: 4.0 (float 타입)
# 정수 제곱근 계산
print(math.isqrt(16)) # 출력: 4 (int 타입)
# 거듭제곱 계산
print(math.pow(2, 3)) # 출력: 8.0 (2의 3승, float 타입)
설명
- math.gcd(12, 18): 12와 18의 최대공약수는 6입니다.
- math.factorial(5): 5!은 5 * 4 * 3 * 2 * 1 = 120입니다.
- math.sqrt(16): 16의 제곱근은 4.0이며, 결과는 부동소수점(float)으로 반환됩니다.
- math.isqrt(16): 16의 정수 제곱근은 4이며, 결과는 정수(int)로 반환됩니다. 소수점 아래 자리를 버릴 수 있어 정수 값이 필요한 경우 유용합니다.
- math.pow(2, 3): 2의 3승은 8.0이며, 결과는 부동소수점(float)으로 반환됩니다.
6. functools
6.1 lru_cache
lru_cache 함수는 메모이제이션을 통해 함수의 실행 속도를 높여주는 데 유용합니다.
재귀 함수를 사용할 때 중복 계산을 방지하고 성능을 향상시킬 수 있습니다.
- @lru_cache(maxsize=None): lru_cache 데코레이터를 사용해 함수의 결과를 캐시(저장)합니다. maxsize=None으로 설정하면 캐시할 값의 개수에 제한이 없습니다.
- lru_cache를 적용한 함수는 같은 인자로 호출될 때 캐시된 결과를 반환하여 중복 계산을 방지합니다.
예제 코드
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(10)) # 출력: 55
설명
- @lru_cache: fibonacci 함수에 lru_cache 데코레이터를 적용하여, 함수가 동일한 인자로 호출될 경우 이전에 계산된 결과를 캐시에서 불러와 반환합니다.
- fibonacci(10): 10번째 피보나치 수를 계산합니다. lru_cache 덕분에 중복되는 재귀 호출이 줄어들어 성능이 향상됩니다.
- 출력: 10번째 피보나치 수는 55입니다.
6.2 reduce
reduce 함수는 리스트와 같은 iterable에서 누적 연산을 수행하는 데 유용합니다.
연속된 값들에 대해 지정된 연산을 순차적으로 적용하여 하나의 결과를 반환합니다.
- reduce(function, iterable): function을 iterable의 모든 요소에 차례로 적용하여 하나의 누적된 결과를 반환합니다.
- 예를 들어, 곱셈, 덧셈 등과 같은 연산을 사용할 때 유용하게 쓸 수 있습니다.
예제 코드
from functools import reduce
numbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers)
print(product) # 출력: 24
설명
- reduce(lambda x, y: x * y, numbers): numbers 리스트의 각 요소를 왼쪽에서 오른쪽으로 순차적으로 곱하여 최종 결과를 반환합니다.
- 1 * 2 = 2
- 2 * 3 = 6
- 6 * 4 = 24
- 출력: 1, 2, 3, 4를 모두 곱한 결과인 24가 반환됩니다.
7. datetime
datetime 모듈은 날짜와 시간을 다루는 기능을 제공합니다. datetime.now()를 사용해 현재 날짜와 시간을 가져오거나, timedelta를 통해 특정 시간 간격을 더하거나 빼는 연산을 수행할 수 있습니다.
주로 날짜 계산이나 시간 차이를 구할 때 사용됩니다.
- datetime.now(): 현재 날짜와 시간을 반환합니다.
- timedelta(weeks=1): 1주일을 나타내는 시간 간격을 생성합니다. timedelta는 일(day), 시간(hours), 분(minutes) 등 다양한 단위로 설정할 수 있습니다.
예제 코드
from datetime import datetime, timedelta
today = datetime.now() # 현재 날짜와 시간
one_week_later = today + timedelta(weeks=1) # 1주일 후의 날짜 계산
print("오늘:", today)
print("1주일 후:", one_week_later)
설명
- datetime.now(): 현재 날짜와 시간을 today 변수에 저장합니다.
- timedelta(weeks=1): 1주일 후를 계산하기 위해 1주일 간격을 설정합니다. today에 timedelta를 더하면 1주일 후 날짜가 계산됩니다.
출력 예시
오늘: 2024-11-04 12:34:56.789012
1주일 후: 2024-11-11 12:34:56.789012
결론
Python의 표준 라이브러리는 코딩 테스트에서 시간과 효율성을 높이는 필수적인 도구입니다. 각 라이브러리의 특징과 용도를 잘 이해하고 활용하면 복잡한 문제도 보다 쉽게 해결할 수 있습니다. 이 글에서 소개한 모듈들을 충분히 연습하여 실전에서 효과적으로 사용해 보세요!⌨️🚀
'프로그래밍 > Python' 카테고리의 다른 글
[Python | GUI] 3. PyQt6 버튼 이벤트 처리와 동적 동작 구현 (1) | 2024.11.28 |
---|---|
[Python | GUI ] 2. UI 파일을 Python에서 직접 로드하여 사용하기 (1) | 2024.11.27 |
[Python | GUI ] 1. PyQt6, Qt Designer를 이용한 GUI 프로그래밍 (0) | 2024.11.26 |
[Python | 유틸리티] tqdm으로 프로그래스 바를 추가해보자! (0) | 2024.11.17 |
[Python | 패키지 관리] Poetry란 무엇인가? (0) | 2024.11.16 |