Personal Study/백준 알고리즘 풀이

[Python] itertools 정리

vㅔ로 2022. 7. 22. 15:38
728x90

요즘 완전 탐색 문제를 푸는데 itertools가 필요한 부분이 많다.

정리를 안 해두니 계속 똑같은 레퍼런스 보면서 코딩하는데, 정리해두고 내 포스팅 보면서 공부하려고 정리한다. 

itertools의 여러가지 기능 중에서도 조합형 이터레이터에 대한 포스팅이다.

설명은 docs.python.org 에서 참고하였다.

 

itertools

효율적인 looping을 위한 iterator를 만드는 모듈

 

조합형 이터레이터

- product(p, q, ... [repeat=1]) : cartesian product, 중복 조합

- permutations(p[, r]) : 모든 가능한 순서, 반복되는 요소 없음

- combinations(p, r) : 순서 정렬, 반복되는 요소 없음

- combinations_with_replacement(p, r) : 순서 정렬, 반복되는 요소 있음

 

product() : 중복 순열

주어진 iterable한 객체들의 조합

대략적으로 중첩된 for loop와 동등

from itertools import product

for i in product('ABC', 'DE'):
	print(i, end=" ")
# ('A', 'D') ('A', 'E') ('B', 'D') ('B', 'E') ('C', 'D') ('C', 'E') 

for i in product(range(4), range(2), range(3)):
	print(i, end=" ")
# (0, 0, 0) (0, 0, 1) (0, 0, 2) (0, 1, 0) (0, 1, 1) (0, 1, 2) 
# (1, 0, 0) (1, 0, 1) (1, 0, 2) (1, 1, 0) (1, 1, 1) (1, 1, 2) 
# (2, 0, 0) (2, 0, 1) (2, 0, 2) (2, 1, 0) (2, 1, 1) (2, 1, 2) 
# (3, 0, 0) (3, 0, 1) (3, 0, 2) (3, 1, 0) (3, 1, 1) (3, 1, 2)

for i in product('AB', repeat=3):
    print(i, end=" ")
# ('A', 'A', 'A') ('A', 'A', 'B') ('A', 'B', 'A') ('A', 'B', 'B') ('B', 'A', 'A') ('B', 'A', 'B') ('B', 'B', 'A') ('B', 'B', 'B') 

for i in product('AB', repeat=2):
    print(i, end=" ")
# ('A', 'A') ('A', 'B') ('B', 'A') ('B', 'B')

 

 

permutations() : 순열

주어진 iterable한 객체에서 중복을 허용하지 않고 r개를 뽑는다.

r이 지정되지 않거나 None인 경우, r의 기본 값은 iterable의 길이이다.

permutations() 에서는 순서가 중요하다. (사전식 순서로 방출됨)

요소는 값이 아닌, 위치로 고유성을 다룬다. (순서가 다르면 다른 경우의 수인 것으로 간주한다.)

 

활용

for i in permutations("ABC"):
    print(i, end=" ")
# ('A', 'B', 'C') ('A', 'C', 'B') ('B', 'A', 'C') ('B', 'C', 'A') ('C', 'A', 'B') ('C', 'B', 'A') 

for i in permutations([1, 2, 3, 4], 2):
    print(i, end=" ")
# (1, 2) (1, 3) (1, 4) (2, 1) (2, 3) (2, 4) (3, 1) (3, 2) (3, 4) (4, 1) (4, 2) (4, 3)

 

combinations() : 조합

주어진 iterable한 객체에서 중복을 허용하지 않고 r개를 뽑는다. 

뽑은 순서는 고려하지 않는다. 

이전에 있었던 조합은 그 뒤에 등장하지 않는다.

Ex. (1, 2)가 존재했다면, (2, 1)은 combinations에서는 존재하지 않는다. <- permutations와의 차이점

 

활용

from itertools import combinations

for i in combinations([1, 2, 3, 4], 2):
    print(i, end=" ")
# (1, 2) (1, 3) (1, 4) (2, 3) (2, 4) (3, 4) 

for i in combinations("ABCD", 3):
    print(i, end=" ")
# ('A', 'B', 'C') ('A', 'B', 'D') ('A', 'C', 'D') ('B', 'C', 'D')

 

combinations_with_replacement() : 중복 조합

주어진 iterable한 객체에서 중복을 허용하여 r개를 뽑는다. 

이전에 있었던 조합은 그 뒤에 등장하지 않는다. 

하나의 요소가 2번 이상 등장할 수 있다.

 

활용

from itertools import combinations_with_replacement

for i in combinations_with_replacement([1, 2, 3], 2):
    print(i, end=" ")
# (1, 1) (1, 2) (1, 3) (2, 2) (2, 3) (3, 3)
for i in combinations_with_replacement("AB", 3):
    print(i, end=" ")
# ('A', 'A', 'A') ('A', 'A', 'B') ('A', 'B', 'B') ('B', 'B', 'B')
728x90

'Personal Study > 백준 알고리즘 풀이' 카테고리의 다른 글

[Python] 백준 11724 DFS 메모리 초과  (1) 2022.06.24
Greedy Algorithm  (0) 2022.01.08
[python] 짧은 지식 - 리스트 정렬  (0) 2021.12.24
규칙  (0) 2021.09.04