Post

조합과 순열

1. 조합 (Combination)

조합은 순서를 고려하지 않고 어떤 원소가 선택되었는지만 중요한 경우를 의미합니다.

alt text

반장 선거에 6명의 학생이 출마했고, 여기서 2명을 선출한다고 가정해봅시다.

  • 첫 번째로 한 명 뽑는 경우
    • 처음에 일단 한 명 먼저 뽑는다고 생각해볼게요. 그러면 이 때는 6명 중에서 아무나 1명 뽑으면 되겠죠.
    • 가능한 선택지: A, B, C, D, E, F → 총 6가지 경우
  • 두 번째로 한 명 더 뽑는 경우
    • 첫 번째로 한 명 뽑았으니까, 이제 남은 5명 중에서 1명만 더 뽑으면 됩니다.
    • 예를 들어 첫 번째로 A를 뽑았으면,
    • 남은 선택지는 B, C, D, E, F → 총 5가지 경우가 있을겁니다.
  • 그래서 전체 경우의 수는?
    • 첫 번째 6가지 경우 × 두 번째 5가지 경우해서, 6 × 5 = 총 30가지가 될겁니다.
  • 하지만 중복된 경우를 제거해야 됩니다.
    • (A학생, B학생)을 뽑은 것과 (B학생, A학생)을 뽑은 것은 같은 경우이니, 이렇게 중복된 경우를 제거해야됩니다.
    • 그래서 전체 경우의 수를 2로 나누면, 30 ÷ 2해서 총 15가지의 조합을 구할 수 있습니다.
    • 이 때 2로 나누는 이유는, 한 조합 안에서 발생되는 중복이 2가지 경우가 있기 때문입니다.

조합 코드

1. math.comb 활용

1
2
from math import comb
print(comb(6, 2))  # 결과: 15

2. itertools.combinations 활용

1
2
3
4
5
6
7
8
9
from itertools import combinations

lst = [1, 2, 3, 4, 5, 6]
pick = 2

result = list(combinations(lst, pick))
print(result)
# 결과:
# [(1, 2), (1, 3), (1, 4), ..., (5, 6)]

2. 순열 (Permutation)

순열은 조합과 다르게 순서를 고려하여 뽑는 경우를 의미합니다.

alt text

예를 들어 6명(A,B,C,D,E,F) 중에서 3명씩 줄을 세울려고 할 때를 가정해보겠습니다.

이것도 조합이랑 똑같이,

  • 일단 첫 번째 자리에는 아무나 올 수 있을겁니다. → 6가지 선택 가능
  • 그리고 두 번째 자리엔 한 명이 이미 앉았으니까, 남은 사람 중에서 선택하는 경우로 5가지의 경우가 있습니다.
  • 마지막으로 세 번째 자리는 이미 두 명이 앉아 있으니까 남은 세 사람 중에서 선택하는 4가지의 경우가 있습니다.
  • 여기선 중복을 제거할 필요가 없으니, 6 X 5 X 4 해서 총 120가지의 경우가 나올겁니다.

순열 코드

1. math.perm 활용

1
2
from math import perm
print(perm(6, 3)) # 결과: 120

2. itertools.permutations 활용

1
2
3
4
5
6
7
8
9
from itertools import permutations

lst = [1, 2, 3, 4, 5, 6]
pick = 3

result = list(permutations(lst, pick))
print(result)
# 결과:
# [(1, 2, 3), (1, 2, 4), (1, 2, 5), ...]

3. 중복 조합 (Product)

중복 조합은 말 그대로 조합에서 같은 원소를 여러 번 선택할 수 있는 조합입니다.

alt text

예를 들어, 음료수 자판기에서 1000원으로 음료수를 2개 뽑는다고 가정해보겠습니다.

  • 자판기 안에 음료수 종류는 콜라, 사이다, 환타가 있고 각 음료수의 가격은 모두 500원으로 동일할 때의 조합은,
  • 콜라-콜라, 콜라-사이다, 콜라-환타같은 음료를 여러 번 선택 할 수 있습니다.
  • 물론 같은 음료수를 마실 수 있다는 가정이 존재한다는 조건하에..

중복 조합 코드

1. math.comb 활용

1
2
from math import comb
print(comb((3 + 2 - 1), 2))

2. itertools.product 활용

1
2
3
4
5
6
7
8
9
from itertools import product

lst = ['콜라', '사이다', '환타']
pick = 2

result = list(product(lst, repeat=pick))
print(result)
# 결과:
# [('콜라', '콜라'), ('콜라', '사이다'), ('콜라', '환타'), ...]

4. itertools vs math 차이점

math 모듈

숫자로 된 조합과 순열 개수만 알고 싶을 때 사용 예를 들어, math.comb(6,2)는 6개 중에서 2개를 선택하는 경우의 수(15)를 반환 math.perm(6,2)는 6개 중에서 2개를 순서 고려하여 나열하는 경우의 수(30)를 반환

itertools 모듈

실제 조합이나 순열을 리스트로 출력하고 싶을 때 사용 예를 들어, list(combinations([1,2,3],2))은 (1,2), (1,3), (2,3) 형태로 출력 list(permutations([1,2,3],2))은 (1,2), (1,3), (2,1), (2,3), (3,1), (3,2) 형태로 출력

This post is licensed under CC BY 4.0 by the author.