ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํน์ ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์์ฃผ ์ฌ์ฉ๋๋ ํ์ค ์์ค์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ๊ตฌํํด ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค. ์จ๋ผ์ธ ์ฝ๋ฉ ํ ์คํธ์์๋ ๋๋ถ๋ถ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ํ์ฉํ๊ณ ์์ผ๋ฏ๋ก, ์์ฃผ ์ฐ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ๊ณต๋ถํด ๋๋ ๊ฒ์ด ์ข๋ค.
์ฃผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๋ด์ฅ ํจ์
- print(), input() ๋ฑ์ ๊ธฐ๋ณธ ์ ์ถ๋ ฅ๊ณผ sorted() ๊ฐ์ ์ ๋ ฌ ๊ธฐ๋ฅ ์ธ ๊ธฐํ ๋ฑ๋ฑ - itertools
- ๋ฐ๋ณต๋๋ ํํ(iterable)์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์์ด, ์กฐํฉ ๋ฑ์ ๊ธฐ๋ฅ ์ ๊ณต - heapq
- ํ(heap) ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ์ฐ์ ์์ ํ ๊ธฐ๋ฅ ๊ตฌํ์ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ - bisect
- ์ด์ง ํ์(binary search) ๊ธฐ๋ฅ ์ ๊ณต - collections
- deque, Counter ๋ฑ์ ์ ์ฉํ ์๋ฃ๊ตฌ์กฐ ์ ๊ณต - math
- ํฉํ ๋ฆฌ์ผ, ์ ๊ณฑ๊ทผ, ์ต๋๊ณต์ฝ์(GCD), ์ผ๊ฐํจ์ ๋ฑ์ ์ํ์ ๊ธฐ๋ฅ ์ ๊ณต
๋ค์์ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฃผ์ ํจ์๋ค์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ์ด๋ค.
๋ด์ฅ ํจ์
# sum(): ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ iterable ๊ฐ์ฒด์ ๋ชจ๋ ์์์ ํฉ ๋ฐํ
result = sum([1, 2, 3, 4, 5]) # 15
# min(): ํ๋ผ๋ฏธํฐ๊ฐ 2๊ฐ ์ด์ ๋ค์ด์์ ๋ ๊ฐ์ฅ ์์ ๊ฐ์ ๋ฐํ
result = min(7, 3, 5, 2) # 2
# max(): ํ๋ผ๋ฏธํฐ๊ฐ 2๊ฐ ์ด์ ๋ค์ด์์ ๋ ๊ฐ์ฅ ํฐ ๊ฐ์ ๋ฐํ
result = min(7, 3, 5, 2) # 7
# eval(): ๋ฌธ์์ด ํ์์ผ๋ก ๋ค์ด์จ ์ํ ์์์ ๊ณ์ฐํ ๊ฒฐ๊ณผ ๋ฐํ
result = eval("(3 + 5) * 7") # 56
# sorted(): ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ iterable ๊ฐ์ฒด๋ฅผ ์ ๋ ฌํ ๊ฒฐ๊ณผ ๋ฐํ
result = sorted([9, 1, 8, 5, 4]) # [1, 4, 5, 8, 9]
result = sorted([9, 1, 8, 5, 4], reverse = True) # [9, 8, 5, 4, 1]
# ํน์ ๊ธฐ์ค์ ๋ฐ๋ผ์ ์ ๋ ฌํ๊ธฐ
# ์ ์์ ๋ฐ๋ผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
score_list = [('ํ๊ธธ๋', 35), ('์ด์์ ', 75), ('์๋ฌด๊ฐ', 50)]
result = sorted(score_list, key = lambda x: x[1])
itertools
itertools์์ ์ ๊ณตํ๋ ํด๋์ค ์ค์ ์ฝ๋ฉ ํ ์คํธ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ํด๋์ค๋ permutations์ combinations์ด๋ค.
permutations๋ iterable ๊ฐ์ฒด์์ r๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์ ์ผ๋ ฌ๋ก ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ(์์ด)๋ฅผ ๊ณ์ฐํด์ค๋ค.
# data ๊ฐ์ฒด์์ 3๊ฐ์ ์์๋ฅผ ๋ฝ์ ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ(์์O ์ค๋ณตX)
from itertools import permutations
data = ['A', 'B', 'C']
result = list(permutations(data, 3))
# [('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
combinations๋ iterable ๊ฐ์ฒด์์ r๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์ ์์๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ(์กฐํฉ)๋ฅผ ๊ณ์ฐํด์ค๋ค.
# data ๊ฐ์ฒด์์ 2๊ฐ์ ์์๋ฅผ ๋ฝ๋ ๋ชจ๋ ๊ฒฝ์ฐ(์์X ์ค๋ณตX)
from itertools import combinations
data = ['A', 'B', 'C']
result = list(combinations(data, 2))
# [('A', 'B'), ('A', 'C'), ('B', 'C')]
product๋ permutations์ ๊ฐ์ด iterable ๊ฐ์ฒด์์ r๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์ ์ผ๋ ฌ๋ก ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ(์์ด)๋ฅผ ๊ณ์ฐํ๋ค. ๋ค๋ง ๋ค๋ฅธ ์ ์ product๋ ๋ฝ๋ ์์์ ์ค๋ณต์ ํ์ฉํ๋ค.
# data ๊ฐ์ฒด์์ 2๊ฐ์ ์์๋ฅผ ๋ฝ์ ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ(์์O ์ค๋ณตO)
from itertools import product
data = ['A', 'B', 'C']
result = list(product(data, repeat = 2))
# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
combinations_with_replacement๋ combinations์ ๊ฐ์ด iterable ๊ฐ์ฒด์์ r๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์ ์์๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ(์กฐํฉ)๋ฅผ ๊ณ์ฐํ๋ค. ๋ค๋ง ๋ค๋ฅธ ์ ์ ์์์ ์ค๋ณต์ ํ์ฉํ๋ค.
# data ๊ฐ์ฒด์์ 2๊ฐ์ ์์๋ฅผ ๋ฝ๋ ๋ชจ๋ ๊ฒฝ์ฐ(์์X ์ค๋ณตO)
from itertools import combinations_with_replacement
data = ['A', 'B', 'C']
result = list(combinations_with_replacement(data, 2))
# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
heapq
heapq ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ(heap) ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ํ์ ์์๋ฅผ ์ฝ์ ํ ๋๋ heapq.heappush()๋ฅผ ์ด์ฉํ๊ณ , ํ์์ ์์๋ฅผ ๊บผ๋ด๊ณ ์ ํ ๋๋ heapq.heappop()์ ์ด์ฉํ๋ค. ๋ค์์ ํ ์ ๋ ฌ(heap sort)๋ฅผ ๊ตฌํํ ์์์ด๋ค.
import heapq
def heapsort(iterable):
h = []
result = []
# ๋ชจ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก ํ์ ์ฝ์
for value in iterable:
heapq.heappush(h, value)
# ํ์ ์ฝ์
๋ ๋ชจ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก ๊บผ๋ด๊ธฐ
for _ 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]
ํ์ด์ฌ์์๋ ๋ณ๋๋ก ์ต๋ ํ(max heap)์ ์ ๊ณตํ์ง ์์ผ๋ฏ๋ก ์ต๋ ํ์ ๊ตฌํํ ๋ ์์์ ๋ถํธ๋ฅผ ์์๋ก ๋ณ๊ฒฝํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค. ์ต๋ ํ์ ์ด์ฉํ์ฌ ๋ด๋ฆผ์ฐจ์ ํ ์ ๋ ฌ์ ๊ตฌํํ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
import heapq
# ์ต๋ ํ์ ์ด์ฉํ ๋ด๋ฆผ์ฐจ์ ํ ์ ๋ ฌ
def heapsort(iterable):
h = []
result = []
# ๋ชจ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก ํ์ ์ฝ์
for value in iterable:
heapq.heappush(h, -value)
# ํ์ ์ฝ์
๋ ๋ชจ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก ๊บผ๋ด๊ธฐ
for _ 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]
bisect
bisect ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ํน์ ํ ์์๋ฅผ ์ฐพ์์ผ ํ ๋ ํจ๊ณผ์ ์ด๋ค. bisect_left()์ bisect_right()๋ ์๊ฐ ๋ณต์ก๋ O(logN)์ ๋์ํ๋ค.
from bisect import bisect_left, bisect_right
a = [1, 2, 4, 4, 8]
x = 4
# ์ ๋ ฌ๋ ์์๋ฅผ ์ ์งํ๋ฉด์ ๋ฆฌ์คํธ a์ ๋ฐ์ดํฐ x๋ฅผ ์ฝ์
ํ ๊ฐ์ฅ ์ผ์ชฝ ์ธ๋ฑ์ค ๋ฐํ
bisect_left(a, x) # 2
# ์ ๋ ฌ๋ ์์๋ฅผ ์ ์งํ๋ฉด์ ๋ฆฌ์คํธ a์ ๋ฐ์ดํฐ x๋ฅผ ์ฝ์
ํ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์ธ๋ฑ์ค ๋ฐํ
bisect_right(a, x) # 4
# ์ ๋ ฌ๋ ๋ฆฌ์คํธ์์ ๊ฐ์ด ํน์ ๋ฒ์์ ์ํ๋ ์์์ ๊ฐ์ ๊ตฌํ๊ธฐ
from bisect import bisect_left, bisect_right
# ๊ฐ์ด [l_value, r_value]์ธ ์์์ ๊ฐ์๋ฅผ ๋ฐํํ๋ ํจ์
def count_by_range(a, l_value, r_value):
l_index = bisect_left(a, l_value)
r_index = bisect_right(a, r_value)
return r_index - l_index
collections
collections์์ ์ ๊ณตํ๋ deque๋ ํ๋ฅผ ๊ตฌํํ ๋ ์ ์ฉํ๋ค. ๊ทธ๋ฐ์ ๋ฑ์ฅ ํ์๋ฅผ ์ธ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ Counter ๋ฑ์ ์ ๊ณตํ๋ค.
# deque๋ฅผ ์ด์ฉํ ์์ ์ฝ์
์ญ์
from collections import deque
data = deque([2, 3, 4])
data.appendleft(1) # ์ ์ผ ์ผ์ชฝ์ 1 ์ฝ์
data.append(5) # ์ ์ผ ์ค๋ฅธ์ชฝ์ 5 ์ฝ์
data.pop() # ์ ์ผ ์ค๋ฅธ์ชฝ ์์(5) ์ญ์
data.popleft() # ์ ์ผ ์ผ์ชฝ ์์(1) ์ญ์
# Counter ๊ฐ๋จ ์ฌ์ฉ๋ฒ
from collections import Counter
data = ['red', 'blue', 'red', 'green', 'blue', 'blue']
counter = Counter(data)
dict(counter) # {'red': 2, 'blue': 3, 'green': 1}
math
from math
math.factorial(x) # x์ ํฉํ ๋ฆฌ์ผ ๋ฐํ
math.sqrt(x) # x์ ์ ๊ณฑ๊ทผ ๋ฐํ
math.gcd(a, b) # a์ b์ ์ต๋ ๊ณต์ฝ์ ๋ฐํ
์ฐธ๊ณ ์๋ฃ: ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋ค with Python (๋๋๋น ์ , ํ๋น๋ฏธ๋์ด)