python 순열, 조합, 중복순열, 중복조합 구현

YulHee Kim·2021년 9월 12일
0

algorithm-study

목록 보기
4/7
post-thumbnail

itertools 라이브러리를 활용하며 순열과 조합에 대해 알아보겠습니다.

🔨 순열(Permutation)

순열이란 서로 다른 n개중에 r개를 선택하는 경우의 수를 의미합니다. (순서 상관 있음)

예를 들어 1~5까지 적힌 카드가 한장씩 있다면, 이 중 세장을 뽑아서 세자리 숫자를 만드는 방법의 경우의 수는 몇일까요?
(1) 백의 자리 카드를 뽑을 때 1~5 중 한 장 -> 총 5가지
(2) 십의 자리 카드를 뽑을 때 (1)에서 뽑은 카드를 제외한 네 장중 하나 -> 4가지
(3) 일의 자리 카드를 뽑을 때 (1),(2)에서 뽑은 카드를 제외한 세 장중 하나 -> 3가지

연달아 일어나는 사건이므로 곱의 법칙을 이용하여
5 x 4 x 3 = 60가지의 답을 구할 수 있습니다.

순열을 기호로 나타낼 때는 순열을 뜻하는 영어 Permutation의 첫 글자 P를 이용합니다.

파이썬 코드로 알아보겠습니다.
itertools 라이브러리에서 순열을 사용할 수 있는 함수는 permutations입니다.

from itertools import permutations

# 1~5까지의 숫자 카드
num_card = [ 1, 2, 3, 4, 5 ]
cards = set(permutations(num_card, 3))

for card in cards:
    print(card)

출력 결과

(5, 4, 2)
(1, 5, 4)
(2, 1, 3)
(4, 2, 1)
(2, 5, 1)
(3, 2, 1)
(4, 5, 3)
(2, 5, 4)
(5, 2, 1)
... 

🔨 조합(Combination)

조합이란 서로 다른 n개중에 r개를 선택하는 경우의 수를 의미합니다. (순서 상관 없음)

예를 들어 어느 음식점에서 5개의 메뉴(a,b,c,d,e)가 있을 때 2개의 메뉴를 주문하는 경우의 수는 몇일까요?
첫번째 메뉴의 선택지는 5가지이고 첫번째 메뉴를 제외하여 두번째 메뉴를 정하려면 4가지입니다. 그래서 경우의 수는 5x4=20이지만 메뉴가 a,b와 b,a는 동일한 경우이므로 나누기 2!을 하여 확률은 5x4/2로 10입니다.

파이썬 코드로 알아보겠습니다.
itertools 라이브러리에서 조합을 사용할 수 있는 함수는 combinations입니다.

from itertools import combinations

# 5가지 메뉴
menu = [ "a", "b", "c", "d", "e" ]
menu_list = set(combinations(menu, 2))

for m in menu_list:
    print(m)

출력 결과

('b', 'c')
('b', 'e')
('a', 'c')
('c', 'd')
('a', 'd')
('a', 'b')
('b', 'd')
('d', 'e')
('c', 'e')
('a', 'e')

🔨 중복 순열(Permutation with repetition)

중복 순열이란 중복 가능한 n개 중에서 r개를 선택하는 경우의 수를 의미합니다. (순서 상관 있음)

위 순열과 똑같은 예제를 파이썬 코드로 알아보겠습니다.
itertools 라이브러리에서 중복순열을 사용할 수 있는 함수는 product입니다.
자세히 보아야 할 점은 repeat이라는 파라미터입니다.
아래 코드를 풀어보면 5개의 숫자중 3개의 중복을 허용하여 뽑는단 소리입니다.

from itertools import product

# 1~5까지의 숫자 카드
num_card = [ 1, 2, 3, 4, 5 ]
cards = set(product(num_card, repeat=3))

for card in cards:
    print(card)

print(len(cards))

출력 결과

...
(1, 5, 5)
(2, 1, 4)
(2, 2, 3)
(2, 5, 2)
(4, 2, 5)
(4, 5, 4)
(5, 5, 1)
(2, 3, 4)
(2, 4, 3)
125

총 개수가 125개입니다.

🔨 중복 조합(Combination with repetition)

중복 조합이란 중복 가능한 n개중에서 r개를 선택하는 경우의 수를 의미합니다.(순서 상관 없음)

위 조합과 똑같은 예제를 파이썬 코드로 알아보겠습니다.
itertools 라이브러리에서 중복조합을 사용할 수 있는 함수는 combinations_with_replacement입니다.
5개의 메뉴 중 2개를 중복 허용하여 뽑은 후 순서를 고려하지 않고 나열하는 경우의 수 입니다.

from itertools import combinations_with_replacement

# 5가지 메뉴
menu = [ "a", "b", "c", "d", "e" ]
menu_list = set(combinations_with_replacement(menu, 2))

for m in menu_list:
    print(m)

print(len(menu_list))

출력 결과

('c', 'e')
('a', 'a')
('a', 'c')
('b', 'e')
('a', 'd')
('e', 'e')
('b', 'b')
('d', 'd')
('a', 'b')
('a', 'e')
('b', 'd')
('d', 'e')
('c', 'c')
('c', 'd')
('b', 'c')
15

위 조합 결과와 비교했을때 ('a','a')도 출력되는 것처럼 중복이 허용되는 걸 알 수있습니다! 😎

수학공식 출처 : https://coding-factory.tistory.com/606

profile
백엔드 개발자

0개의 댓글