{'A', 'B', 'C'}에서 세 개를 선택하여 나열하는 경우: 'ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA'
조합: 서로 다른 n개에서 순서에 상관없이 서로 다른 r개를 선택하는 것
{'A', 'B', 'C'}에서 순서를 고려하지 않고 두 개를 뽑는 경우: 'AB', 'AC', 'BC'
모든 경우의 수가 총 얼마가 될 지 짐작해서 문제를 풀어야 함
순열의 수가 천만, 1억 단위를 넘어가는 경우, 완전탐색을 이용했을 때 시간초과 판정 받을 확률이 높음.
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')]
from itertools import combinations
data = ['A', 'B', 'C'] #데이터 준비
result = list(combinations(data,2))
print(result)
#[('A', 'B'), ('A', 'C'), ('B', 'C')]
중복 순열과 중복 조합
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')]
from itertools import combinations_with_replacement
data = ['A', 'B', 'C'] #데이터 준비
result = list(combinations_with_replacement(data,2)) #2개를 뽑는 모든 조합 구하기(중복 허용)
print(result)
#[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
Counter
파이썬 collecitons 라이브러리의 Counter는 등장 횟수를 세는 기능을 제공합니다.
리스트와 같은 반복 가능한(iterable) 객체가 주어졌을 때 내부의 원소가 몇 번씩 등장했는지를 알려줍니다.
from collections import Counter
counter = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
print(counter['blue']) # 'blue'가 등장한 횟수 출력
#3
print(counter['green']) # 'green'이 등장한 횟수 출력
#1
print(dict(counter)) # 사전 자료형으로 반환
#{'red': 2, 'blue': 3, 'green': 1}
최대 공약수와 최소 공배수
최대 공약수를 구해야 할 때는 math 라이브러리의 gcd() 함수를 이용할 수 있습니다.
import math
# 최소 공배수(LCM)를 구하는 함수
def lcm(a, b):
return a * b // math.gcd(a,b)
a = 21
b = 14
print(math.gcd(21, 14)) #최대 공약수 (GCD) 계산
#7
print(lcm(21, 14)) #최소 공배수 (LCM) 계산
#42
댓글 영역