Stay Hungry Stay Foolish

알고리즘

[파이썬] 순열(Permutations) 과 조합(Combinations)

dev스카이 2024. 11. 6. 11:24

permutations (순열)

파이썬의 permutations 함수는 순열을 생성하여, 주어진 순서로 뽑을 수 있는 모든 경우의 수를 구한다. 순서가 중요한 경우에 사용된다. itertools 모듈에 포함되어 있어 사용 전에 이 모듈을 임포트해야 한다.

 

기본 구문

from itertools import permutations

permutations(iterable, r)
  • iterable : 순열을 생성할 대상 (리스트, 문자열 등).
  • r : 순열의 길이 (뽑을 개수). r을 생략하면 기본값은 len(iterable)로 설정된다.

 

사용 방법

 

1️⃣ 기본 사용

from itertools import permutations

items = ['a', 'b', 'c']
perm = permutations(items, 2)
print(list(perm))
출력 결과
[('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]
  • items에서 2개씩 순서 있게 뽑는 모든 경우의 수를 생성한다.
  • 결과는 튜플 형태로 반환된다.

 

2️⃣ 전체 길이의 순열 생성

r 값을 생략하면 len(iterable)을 사용하여 전체 길이의 순열을 생성한다.

perm = permutations(items)
print(list(perm))

 

출력 결과

[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]

 

 

3️⃣ 문자열 순열 생성

문자열에서도 사용할 수 있다. 각 문자 순서가 중요한 모든 경우의 수를 생성한다.

perm = permutations('ABC', 2)
print(list(perm))

 

출력 결과

[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
 
 
 

4️⃣ 중첩 for문으로 출력하기

permutations의 결과를 중첩된 for문으로 처리해 원하는 형태로 출력할 수 있다.

items = [1, 2, 3]
for perm in permutations(items, 2):
    print(perm)

 

출력 결과

(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)
 

요약

  • permutations는 순서를 고려하여 특정 길이만큼 요소를 뽑는 모든 순열을 생성한다.
  • 결과는 튜플로 반환되며, list()로 변환해 모든 순열을 리스트로 볼 수 있다.
  • 순열의 길이 r을 지정할 수 있으며, 생략 시 전체 길이로 순열이 생성된다.
  • itertools 모듈에서 가져와야 사용 가능하다.

combinations (조합)

파이썬의 combinations순서에 상관없이 주어진 길이만큼 원소를 뽑는 모든 조합을 생성해주는 함수이다. itertools 모듈에 포함되어 있어, 이 모듈을 먼저 임포트해야 한다.

 

기본 구문

from itertools import combinations

combinations(iterable, r)
  • iterable : 조합을 생성할 대상(예: 리스트, 문자열 등).
  • r : 조합의 길이 (뽑을 개수).

 

사용 방법

 

1️⃣ 기본 사용

from itertools import combinations

items = ['a', 'b', 'c']
combi = combinations(items, 2)
print(list(combi))

 

출력 결과

[('a', 'b'), ('a', 'c'), ('b', 'c')]
  • 'a', 'b', 'c' 중에서 2개씩 조합을 생성한다.
  • 결과는 튜플 형태로 반환된다.

 

2️⃣ 문자열에서 조합 생성

문자열도 iterable이기 때문에, 조합을 구할 수 있다.

combi = combinations('ABCD', 2)
print(list(combi))

 

출력 결과

[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]

 

 

3️⃣ 모든 조합 생성

전체 가능한 조합을 구하려면, 길이 r을 1부터 len(iterable)까지 늘려가면서 구할 수 있다.

items = ['x', 'y', 'z']
all_combinations = [list(combinations(items, r)) for r in range(1, len(items) + 1)]
print(all_combinations)

 

출력 결과

[[('x',), ('y',), ('z',)], [('x', 'y'), ('x', 'z'), ('y', 'z')], [('x', 'y', 'z')]]

 

 

4️⃣ 이중 for문으로 출력하기

combinations를 이중 for문으로 순회하여 원하는 형태로 출력할 수도 있다.

items = [1, 2, 3]
for combi in combinations(items, 2):
    print(combi)

 

출력 결과

(1, 2)
(1, 3)
(2, 3)

 

요약

  • combinations는 순서를 고려하지 않고 특정 길이만큼 요소를 뽑는 모든 조합을 생성한다.
  • 결과는 튜플 형태로 반환되며, list()로 변환하면 전체 조합을 리스트로 볼 수 있다.
  • 조합의 길이 r을 지정해야 하며, itertools 모듈에서 가져와야 사용 가능하다.

 

Permutations 와 Combinations 의 차이

permutations와 combinations의 주요 차이는 순서를 고려하는지 여부이다.

  • permutations
    • 순서를 중요하게 생각한다. 같은 원소라도 순서가 다르면 다른 경우로 간주한다.
    • 예를 들어, ('a', 'b')와 ('b', 'a')는 다른 순열로 본다.
  • combinations
    • 순서를 중요하지 않게 생각한다. 같은 원소가 다른 순서로 배치되더라도 같은 조합으로 간주한다.
    • 예를 들어, ('a', 'b')와 ('b', 'a')는 같은 조합으로 취급된다.

예시

  • permutations(['a', 'b'], 2) → [('a', 'b'), ('b', 'a')]
  • combinations(['a', 'b'], 2) → [('a', 'b')]

 

📌 정리

permutations는 순서가 중요할 때 사용하고, combinations는 순서가 중요하지 않을 때 사용한다.