์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ
5. ์ ์ถ๋ ฅ
1) ๊ธฐ๋ณธ ์ ๋ ฅ๋ฐ๊ธฐ
- input() : ํ ์ค์ ๋ฌธ์์ด ์ ๋ ฅ ๋ฐ๊ธฐ
- ์ ์ํ ๋ฐ์ดํฐ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ int() ํจ์๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
- list(map(int, input().split()) : ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋๋ ์ฌ๋ฌ ๊ฐ์ ์ ์ํ ๋ฐ์ดํฐ ์ ๋ ฅ ๋ฐ์์ ๋ฆฌ์คํธ์ ์ ์ฅ
- ์์ 1) ์ ๋ ฅ์ ์ํ ์ ํ์ ์ธ ์์ค์ฝ๋
# ๋ฐ์ดํฐ์ ๊ฐ์ ์
๋ ฅ
n = int(input())
# ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์
๋ ฅ
data = list(map(int, input().split())
data.sort(reverse=True)
print(data)
# ์
๋ ฅ
# 5
# 65 90 75 34 99
# ์ถ๋ ฅ
# [99, 90, 75, 65, 34]
- ์์ 2) ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ ์ ์์ ๋ฐ์ดํฐ ์ ๋ ฅ
n, m, k = map(int, input().split())
print(n, m, k)
# ์
๋ ฅ
# 3 5 7
# ์ถ๋ ฅ
# 3 5 7
2) sys ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ์ฌ ์ ๋ ฅ๋ฐ๊ธฐ
- ์ ๋ ฅ์ ๊ฐ์๊ฐ ๋ง์ ๊ฒฝ์ฐ์๋ input() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค. ๋ฐ๋ผ์ sys๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์๋์ด ์๋ sys.stdin.readline() ํจ์๋ฅผ ์ด์ฉํ๋ค.
import sys
sys.stdin.readline().rstrip()
- ํ ์ค์ฉ ์ ๋ ฅ๋ฐ๊ธฐ ์ํด ์ฌ์ฉ
- ํ ์ค ์ ๋ ฅ ๋ฐ์ ํ rstrip() ํจ์๋ฅผ ๊ผญ ํธ์ถํด์ผ ํ๋ค. ์ํฐ๊ฐ ์ค ๋ฐ๊ฟ ๊ธฐํธ๋ก ์ ๋ ฅ๋๋ฏ๋ก ๊ณต๋ฐฑ ๋ฌธ์๋ฅผ ์ ๊ฑฐํด์ค์ผ ํ๋ค.
- ์์1) readline() ์ฌ์ฉ ์์ค์ฝ๋ ์์
import sys
# ๋ฌธ์์ด ์
๋ ฅ๋ฐ๊ธฐ
data = sys.stdin.readline().rstrip()
print(data)
# ์
๋ ฅ
# Hello World
# ์ถ๋ ฅ
# Hello World
6. ์ฃผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฌธ๋ฒ๊ณผ ์ ์์
- ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ : ํน์ ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์์ฃผ ์ฌ์ฉ๋๋ ํ์ค ์์ค์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ๊ตฌํํด ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๊ณต์ ๋ฌธ์ ์ฃผ์
https://docs.python.org/ko/3/library/index.html
1) ๋ด์ฅ ํจ์ : print(), input()๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ์ ์ถ๋ ฅ ๊ธฐ๋ฅ๋ถํฐ sorted() ์ ๊ฐ์ ์ ๋ ฌ ๊ธฐ๋ฅ์ ํฌํจํ๊ณ ์๋ ๊ธฐ๋ณธ ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ํ์ด์ฌ ํ๋ก๊ทธ๋จ์ ์์ฑํ ๋ ์์ด์๋ ์๋๋ ํ์์ ์ธ ๊ธฐ๋ฅ์ ํฌํจํ๊ณ ์๋ค.
2) itertools : ํ์ด์ฌ์์ ๋ฐ๋ณต๋๋ ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์์ด๊ณผ ์กฐํฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค.
3) heapq: ํ(Heap) ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ฐ์ ์์ ํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
4) bisect : ์ด์งํ์(Binary Search) ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
5) collections : ๋ฑ(deque), ์นด์ดํฐ(Counter) ๋ฑ์ ์ ์ฉํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ํฌํจํ๊ณ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
6) math: ํ์์ ์ธ ์ํ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ํฉํ ๋ฆฌ์ผ, ์ ๊ณฑ๊ทผ, ์ต๋๊ณต์ฝ์(GCD), ์ผ๊ฐํจ์ ๊ด๋ จํจ์๋ถํฐ ํ์ด(pi)์ ๊ฐ์ ์์๋ฅผ ํฌํจํ๊ณ ์๋ค.
๋ด์ฅ ํจ์
- sum() : ์์์ ํฉ ๋ฐํ
result = sum([1, 2, 3, 4, 5])
print(result)
# ์ถ๋ ฅ -> 15
- min() : ํ๋ผ๋ฏธํฐ๊ฐ 2๊ฐ ์ด์ ๋ค์ด์์ ๋ ๊ฐ์ฅ ์์ ๊ฐ ๋ฐํ
result = min(7, 3, 5, 2)
print(result)
# ์ถ๋ ฅ -> 2
- max() : ํ๋ผ๋ฏธํฐ๊ฐ 2๊ฐ ์ด์ ๋ค์ด์์ ๋ ๊ฐ์ฅ ํฐ ๊ฐ ๋ฐํ
result = max(7, 3, 5, 2)
print(result)
# ์ถ๋ ฅ -> 7
- eval() : ์ํ ์์์ด ๋ฌธ์์ด ํ์์ผ๋ก ๋ค์ด์ค๋ฉด ํด๋น ์์์ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
result = eval("(3+5)*7")
print(result)
# ์ถ๋ ฅ -> 56
- sorted() : iterable ๊ฐ์ฒด๊ฐ ๋ค์ด์์ ๋, ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค. key ์์ฑ์ผ๋ก ์ ๋ ฌ ๊ธฐ์ค์ ๋ช ์ํ ์ ์์ผ๋ฉฐ, reverse ์์ฑ์ผ๋ก ์ ๋ ฌ๋ ๊ฒฐ๊ณผ ๋ฆฌ์คํธ๋ฅผ ๋ค์ง์์ง์ ์ฌ๋ถ๋ฅผ ์ค์ ํ ์ ์๋ค.
- ์์1)
result = sorted([9, 1, 8, 5, 4]) # ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
print(result)
result = sorted([9, 1, 8, 5, 4], reverse = True) # ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ
print(result)
# ์ถ๋ ฅ
# [1, 4, 5, 8, 9]
# [9, 8, 5, 4, 1]
- ์์2) key ์์ฑ ์ฌ์ฉํ์ฌ ์ ๋ ฌ
result = sorted([('ํ๊ธธ๋', 35), ('์ด์์ ', 75), ('์๋ฌด๊ฐ', 50)], key = lambda x: x[1], reverse = True)
print(result)
# ์ถ๋ ฅ
# [('์ด์์ ', 75), ('์๋ฌด๊ฐ', 50), ('ํ๊ธธ๋', 35)]
- sort() : ๋ฆฌ์คํธ ๊ฐ์ฒด์ ๋ด๋ถ ๊ฐ์ด ์ ๋ ฌ๋ ๊ฐ์ผ๋ก ๋ฐ๋ก ์ ๋ ฌ
data = [9, 1, 8, 5, 4]
data.sort()
print(data)
# ์ถ๋ ฅ
# [1, 4, 5, 8, 9]
itertools
- permutations : ๋ฆฌ์คํธ์ ๊ฐ์ iterable ๊ฐ์ฒด์์ r๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์ ์ผ๋ ฌ๋ก ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ(์์ด)๋ฅผ ๊ณ์ฐํด์ค๋ค.
- ์์) ๋ฆฌ์คํธ์์ 3๊ฐ๋ฅผ ๋ฝ์ ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ
from itertools import permutations
data = ['A', 'B', 'C'] # ๋ฐ์ดํฐ ์ค๋น
result = list(permutations(data, 3)) # ๋ชจ๋ ์์ด ๊ตฌํ๊ธฐ
print(result)
# ์ถ๋ ฅ -> [('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
- combinations : ๋ฆฌ์คํธ์ ๊ฐ์ iterable ๊ฐ์ฒด์์ r๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์ ์์๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ(์กฐํฉ)๋ฅผ ๊ณ์ฐํ๋ค.
- ์์) ๋ฆฌ์คํธ์์ 2๊ฐ๋ฅผ ๋ฝ์ ์์์ ์๊ด์์ด ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ
from itertools import combinations
data = ['A', 'B', 'C'] # ๋ฐ์ดํฐ ์ค๋น
result = list(combinations(data, 2)) # 2๊ฐ๋ฅผ ๋ฝ๋ ๋ชจ๋ ์กฐํฉ ๊ตฌํ๊ธฐ
print(result)
# ์ถ๋ ฅ -> [('A', 'B'), ('A', 'C'), ('B', 'C')]
- product : ์์ด๊ณผ ๊ฐ์ด ๋ฆฌ์คํธ์ ๊ฐ์ iterable ๊ฐ์ฒด์์ r๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์ ์ผ๋ ฌ๋ก ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ(์์ด)๋ฅผ ๊ณ์ฐํ๋ค. ์์๋ฅผ ์ค๋ณตํ์ฌ ๋ฝ๋๋ค. product ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ ๋๋ ๋ฝ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ์๋ฅผ repeat ์์ฑ๊ฐ์ผ๋ก ๋ฃ์ด์ค๋ค.
- ์์) ๋ฆฌ์คํธ์์ ์ค๋ณต์ ํฌํจํ์ฌ 2๊ฐ๋ฅผ ๋ฝ์ ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ ์ถ๋ ฅ
from itertools import product
data = ['A', 'B', 'C']
result = list(product(data, repeat=2)) # 2๊ฐ๋ฅผ ๋ฝ๋ ๋ชจ๋ ์์ด ๊ตฌํ๊ธฐ(์ค๋ณต ํ์ฉ)
print(result)
# ์ถ๋ ฅ
# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
- combinations_with_replacement : ์กฐํฉ๊ณผ ๊ฐ์ด ๋ฆฌ์คํธ์ ๊ฐ์ iterable ๊ฐ์ฒด์์ r๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์ ์์๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ(์กฐํฉ)๋ฅผ ๊ณ์ฐํ๋ค. ์์๋ฅผ ์ค๋ณตํ์ฌ ๋ฝ๋๋ค.
- ์์) ๋ฆฌ์คํธ์์ ์ค๋ณต์ ํฌํจํ์ฌ 2๊ฐ๋ฅผ ๋ฝ์ ์์์ ์๊ด์์ด ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ถ๋ ฅ
from itertools import combinations_with_replacement
data = ['A', 'B', 'C']
result = list(combinations_with_replacement(data, repeat=2)) # 2๊ฐ๋ฅผ ๋ฝ๋ ๋ชจ๋ ์กฐํฉ ๊ตฌํ๊ธฐ(์ค๋ณต ํ์ฉ)
print(result)
# ์ถ๋ ฅ
# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
heapq
- ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์์ ์ฐ์ ์์ ํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ ํ ๋ ์ฌ์ฉ๋๋ค.
- ์ต์ ํ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฏ๋ก ์๊ฐ๋ณต์ก๋ O(NlogN)์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ด ์๋ฃ๋๋ค.
- heapq.heappush() : ์์ ์ฝ์
- heapq.heappop() : ์์ ์ญ์
- ์์ 1) ํ ์ ๋ ฌ ๊ตฌํ
import heapq
def heapsort(iterable):
h = []
result = []
# ๋ชจ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก ํ์ ์ฝ์
for value in iterable:
heapq.heappush(h, value)
# ํ์ ์ฝ์
๋ ๋ชจ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก ๊บผ๋ด์ด ๋ด๊ธฐ
for i in range(len(h)):
result.append(heapq.heqppop(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]
- ์์ 2) ์ต๋ ํ ๊ตฌํ(๋ด๋ฆผ์ฐจ์ ํ ์ ๋ ฌ) -> ์์์ ๋ถํธ๋ฅผ ์์๋ก ๋ณ๊ฒฝํ๋ ๋ฐฉ์ ์ฌ์ฉ
import heapq
def heapsort(iterable):
h = []
result = []
# ๋ชจ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก ํ์ ์ฝ์
for value in iterable:
heapq.heappush(h, -value)
# ํ์ ์ฝ์
๋ ๋ชจ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก ๊บผ๋ด์ด ๋ด๊ธฐ
for i in range(len(h)):
result.append(-heapq.heqppop(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_left(a, x) : ์ ๋ ฌ๋ ์์๋ฅผ ์ ์งํ๋ฉด์ ๋ฆฌ์คํธ a์ ๋ฐ์ดํฐ x๋ฅผ ์ฝ์ ํ ๊ฐ์ฅ ์ผ์ชฝ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋ ๋ฉ์๋
- bisect_right(a, x) : ์ ๋ ฌ๋ ์์๋ฅผ ์ ์งํ๋ฉด์ ๋ฆฌ์คํธ a์ ๋ฐ์ดํฐ x๋ฅผ ์ฝ์ ํ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋ ๋ฉ์๋
from bisect import bisect_left, bisect_right
a = [1, 2, 4, 4, 8]
x = 4
print(bisect_left(a, x))
print(bisect_right(a, x))
# ์ถ๋ ฅ
# 2
# 4
- ์ ๋ ฌ๋ ๋ฆฌ์คํธ์์ ๊ฐ์ด ํน์ ๋ฒ์์ ์ํ๋ ์์์ ๊ฐ์๋ฅผ ๊ตฌํ๊ณ ์ ํ ๋, ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ค.
- ์์ ) left_value <= x <= right_value์ธ ์์์ ๊ฐ์ ๊ณ์ฐ (์๊ฐ๋ณต์ก๋ : O(logN))
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))
# ๊ฐ์ด [-1, 3] ๋ฒ์์ ์๋ ๋ฐ์ดํฐ ๊ฐ์ ์ถ๋ ฅ
print(count_by_range(a, -1, 3))
# ์ถ๋ ฅ
# 2
# 6
collections
1) deque : ํ๋ฅผ ๊ตฌํํ ๋ ์ฌ์ฉํ๋ค. ์คํ ํน์ ํ์ ์๋ฃ๊ตฌ์กฐ์ ๋์ฉ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ค. ์๊ฐ๋ณต์ก๋ : O(1)
- popleft() : ์ฒซ ๋ฒ์งธ ์์ ์ ๊ฑฐ
- pop() : ๋ง์ง๋ง ์์ ์ ๊ฑฐ
- appendleft(x) : ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค์ ์์ x๋ฅผ ์ฝ์
- append(x) : ๋ง์ง๋ง ์ธ๋ฑ์ค์ ์์ x๋ฅผ ์ฝ์
from collections import deque
data = deque([2, 3, 4])
data.appendleft(1)
data.append(5)
print(data)
print(list(data)) # ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ๋ณํ
# ์ถ๋ ฅ
# deque([1, 2, 3, 4, 5])
# [1, 2, 3, 4, 5]
2) counter : ๋ฆฌ์คํธ์ ๊ฐ์ iterable ๊ฐ์ฒด ๋ด๋ถ์ ์์๊ฐ ๋ช ๋ฒ์ฉ ๋ฑ์ฅํ๋์ง๋ฅผ ์๋ ค์ค๋ค. ์์๋ณ ๋ฑ์ฅ ํ์๋ฅผ ์ธ๋ ๊ธฐ๋ฅ์ด ํ์ํ ๋ ์ฌ์ฉ
from collections import Counter
counter = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
print(counter['blue']) # 'blue'๊ฐ ๋ฑ์ฅํ ํ์ ์ถ๋ ฅ
print(counter['green']) # 'green'์ด ๋ฑ์ฅํ ํ์ ์ถ๋ ฅ
print(dict(counter)) # ์ฌ์ ์๋ฃํ์ผ๋ก ๋ณํ
# ์ถ๋ ฅ
# 3
# 1
# {'red':2, 'blue':3, 'green':1}
math
- ํฉํ ๋ฆฌ์ผ, ์ ๊ณฑ๊ทผ, ์ต๋๊ณต์ฝ์, ํ์ด, ์์ ๊ธฐ๋ฅ ํฌํจ
- ์์ )
import math
print(math.factorial(5)) # 5 ํฉํ ๋ฆฌ์ผ ์ถ๋ ฅ -> 120
print(math.sqrt(7)) # 7์ ์ ๊ณฑ๊ทผ ์ถ๋ ฅ -> 2.6457513110645907
print(math.gcd(21, 14)) # 21๊ณผ 14์ ์ต๋ ๊ณต์ฝ์ ์ถ๋ ฅ -> 7
print(math.pi) # ํ์ด(pi) ์ถ๋ ฅ -> 3.141592653589793
print(math.e) # ์์ฐ์์ e ์ถ๋ ฅ -> 2.718281828459045