콘텐츠로 건너뛰기
Home » permutations

permutations

순열과 조합 – itertools (python)

알려져 있는 원소들로 구성되는 가능한 모드 조합 및 순열을 구하려 할 때, 이를 직접 구현해보는 것도 좋지만 itertools 모듈에 있는 함수를 사용하는 것을 추천한다. 이 함수들은 기본적으로 제너레이터 함수이기 때문에 한번에 리스트 등으로 만들기 전까지는 메모리에 큰 부담을 주지 않으며 성능도 적절한 편이다. 오늘은 itertools의 함수 중에서 순열과 조합에 관련된 함수들을 알아보도록 하자.

더 보기 »순열과 조합 – itertools (python)

순열생성로직연구

사실 이 포스팅은 순열을 만드는 방법에 대한 매우 비효율적인 접근에 대한 글입니다. 효율적인 순열/조합 생성 코드는 이 글을 참고하세요.

순열을 만드는 가장 간단한 방법으로는 특정 원소를 하나씩 뺀 후 배열의 나머지를 순열한 각 결과에 빼냈던 원소를 앞에 붙여준 결과를 모으는 방법이 있다. 대략의 코드는 다음과 같다.

def rec_perm(iterable):
    if len(iterable) == 1:
        return [list(iterable)]
    result = []
    for i in range(len(iterable)):
        head = iterable[i]
        tail = iterable[:i] + iterable[i+1:]
        result += [[head] + x for x in rec_perm(tail)]
    return result

이 알고리듬의 가장 큰 문제는 한 번에 모든 순열을 다 생성해서 그 리스트를 만환한다는 말이다. 만약 원소가 100개라면?1 메모리 부족으로 컴퓨터가 뻗을 수 있다. 물론 10개 미만의 연속열에 대해서는 나름 나쁘지 않은 성능을 낼 수 있다.

더 보기 »순열생성로직연구

순열 조합 제너레이터 구현하기

파이썬 기본 모듈인 itertools는 리스트와 같은 반복 가능한 객체에 대한 여러 연산을 위한 함수를 제공하는데, 특정한 원소들로 만들 수 있는 순열이나 조합을 구하는 함수들도 이 모듈에 포함되어 있다. 특정한 원소를 가지고 만들 수 있는 모든 순열은 itertools.permutations() 함수로, 모든 조합은 itertools.combinations() 함수로 만들 수 있다. 그 외에 중복을 포함하는 조합등을 생성하는 함수가 제공된다.

아주아주 예전에는 순열/조합을 생성하는 함수를 구현하는 것이 간단한 작업이 아니었는데, 제너레이터에서 다른 제너레이터로 결과 생성을 위임하는 yield from 문법이 생긴 이후에는 이를 아주 간단히 구현할 수가 있게 되었다. 그래서 오늘은 제너레이터를 이용해서 주어진 리스트나 튜플에서 순열 및 조합을 생성하는 제너레이터를 만드는 방법을 소개하고자 한다.

더 보기 »순열 조합 제너레이터 구현하기