Hey Tech

[파이썬] 순열, 조합, 중복 순열, 중복 조합 계산하기!(feat. itertools 라이브러리) 본문

SW 개발/Python

[파이썬] 순열, 조합, 중복 순열, 중복 조합 계산하기!(feat. itertools 라이브러리)

Tony Park (토니) 2021. 4. 21. 12:21
728x90
반응형

안녕하세요, 오늘은 파이썬 itertools 라이브러리를 활용하여 순열(Permutation), 조합(Combination), 중복 순열(Permutation with reptition), 중복 조합(Combination with reptition)을 계산하는 방법에 대해 공유해 드립니다. 그럼 바로 시작하죠!

📚 목차

1.  순열(Permutation)
2.  조합(Combination)
3.  중복 순열(Permutation with repetition)
4.  중복 조합(Combination with repetition)

1.  순열(Permutation)

순열은 \(n\) 개의 데이터 중에서 \(r\) 개의 데이터를 뽑아 일렬로 나열하는 모든 경우의 수로서 수학적인 기호로는 \(_{n}P_{r}\) 와 같이 나타냅니다. 순열은 itertools 라이브러리에서 permutations 함수를 활용해 계산할 수 있습니다. 예를 들어, 파이썬에서 \(A, B, C\)라는 3개의 데이터가 있다고 했을 때, 3개를 뽑아 일렬로 나열하는 경우의 수를 구해보겠습니다.

from itertools import permutations

dataset = ['A', 'B', 'C']

res = list(permutations(dataset, 3))
print(f"모든 조합: {res}") # [('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
print(f"모든 경우의 수: {len(res)}") # 6

2.  조합(Combination)

조합은  \(n\)개의 데이터 중에서 \(r\) 개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우의 수로서 수학적인 기호로는 \(_{n}C_{r}\) 와 같이 나타냅니다. 순열은 itertools 라이브러리에서 combinations 함수를 활용해 계산할 수 있습니다. 이번에는 \(A, B, C\)라는 3개의 데이터가 있다고 했을 때, 2개를 뽑아 순서에 관계없이 나열하는 경우의 수를 출력해 보겠습니다.

from itertools import combinations

dataset = ['A', 'B', 'C']

res = list(combinations(dataset, 2))
print(f"모든 경우: {res}") # [('A', 'B'), ('A', 'C'), ('B', 'C')]
print(f"모든 경우의 수: {len(res)}") # 3

3.  중복 순열(Permutation with repetition)

중복 순열은 \(n\) 개의 데이터 중에서 \(r\) 개의 데이터를 뽑아 일렬로 나열하는 모든 경우의 수이며 특히 데이터를 중복하여 뽑습니다. 중복 순열은 itertools 라이브러리에서 product 함수를 활용해 계산할 수 있습니다. 이번에도 리스트 \(A, B, C\)로  3개의 데이터가 있을 때 2개를 중복을 허용하여 뽑은 후 일렬로 나열하는 경우의 수를 구해 보겠습니다.

from itertools import product

dataset = ['A', 'B', 'C']

# 2개를 뽑아 일렬로 나열하는 경우의 수(단, 중복 허용)
res = list(product(dataset, repeat = 2))
print(f"모든 경우: {res}") # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
print(f"모든 경우의 수: {len(res)}") # 9

4.  중복 조합(Combination with repetition)

중복 조합은 \(n\) 개의 데이터 중에서 \(r\) 개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우의 수이며 특히 데이터를 중복하여 뽑습니다. 중복 조합은 itertools 라이브러리에서 combinations_with_replacement 함수를 활용해 계산할 수 있습니다. 이번에도 리스트 \(A, B, C\)로  3개의 데이터가 있을 때 2개를 중복을 허용하여 뽑은 후 순서를 고려하지 않고 나열하는 경우의 수를 구해 보겠습니다.

from itertools import combinations_with_replacement

dataset = ['A', 'B', 'C']

# 2개를 뽑아 순서 고려없이 나열하는 경우의 수(단, 중복 허용)
res = list(combinations_with_replacement(dataset, 2))
print(f"모든 경우: {res}") # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
print(f"모든 경우의 수: {len(res)}") # 9

마치며...

오늘은 파이썬 표준 라이브러리를 활용해 순열, 조합, 중복 순열, 중복 조합을 계산하는 방법에 대해 알아봤습니다. itertools 라이브러리를 활용하면 일일이 코드로 구현하지 않고도 쉽게 결괏값을 얻을 수 있다는 큰 장점이 있습니다. 따라서 시간 효율 측면이나 계산 정확도를 보장하기 위해서는 해당 라이브러리의 사용방법에 대해 숙지하는 것을 추천해 드립니다.


포스팅 내용에 오류가 있을 경우 댓글 남겨주시면 감사드리겠습니다.

그럼 오늘도 즐거운 하루 보내시길 바랍니다 :)

고맙습니다.

728x90
반응형