파이썬의 itertools 는 코딩 테스트에서 강력한 무기입니다.
특히 완전탐색, 브루트포스, 조합 문제에서 효율적인 풀이를 가능하게 합니다.
이글에서는 코테에서 가장 자주 사용되는 itertools 함수 6개를 실전 예제와 함께 소개합니다.
다음은 코테 내 사용 비중을 감안하여 정리해 본 표입니다.
특히, 이거 없으면 문제 못푸나? 라고 궁금하신 분을 위해서 그냥 직접 구현도 가능한지에 대한 언급도 하였습니다.
순위 | 함수명 | 사용 비중 | 대체 가능성 | 설명 |
1️⃣ | permutations() | 높음 | 직접 구현 가능하지만 실수 잦음 | 순열 : 순서 있는 경우의 수 탐색에 최적 |
2️⃣ | combinations() | 높음 | 직접 구현 가능 | 조합 : 조합 문제에 자주 등장 |
3️⃣ | product() | 중간 | 이중 루프 등으로 대체 가능 | 중복순열 : 중복 허용 순열에 유용 |
4️⃣ | combinations_with_replacement() | 낮음 | 중첩 루프 또는 재귀로 구현 가능 | 중복조합 : 특정 케이스에서만 활용 |
5️⃣ | accumulate() | 낮음 | prefix sum 등으로 대체 | 누적합 : 간단한 누적 계산 시 유용 |
6️⃣ | groupby() | 낮음 | dict + loop로 구현 가능 | 그룹화 : 정렬 후 그룹핑 문제에 사용 |
아래에서 순서, 중복이라는 의미는
뽑을때 순서가 있는지
뽑을때 중복해서 뽑을 수 있는지
헷갈릴 수 있으니 반복 숙달하시기 바랍니다.
1. permutations() - 순열 (순서 O, 중복 X)
from itertools import permutations
# 예시: [1, 2, 3] 중 2개를 뽑아 순서 있게 나열
for p in permutations([1, 2, 3], 2):
print(p)
# (1, 2)
# (1, 3)
# (2, 1)
# (2, 3)
# (3, 1)
# (3, 2)
📌 활용 문제: 외판원 문제 (TSP), 숫자 나열, 경로 탐색
예: 비밀번호 가능한 조합 찾기, 미로 이동 경로 모든 경우의 수
2. combinations() - 조합 (순서 X, 중복 X)
from itertools import combinations
# 예시: [1, 2, 3] 중 2개를 순서 상관없이 뽑기
for c in combinations([1, 2, 3], 2):
print(c)
# (1, 2)
# (1, 3)
# (2, 3)
📌 활용 문제: 부분집합, 메뉴 구성, 후보 조합
예: 치킨집 고르기, 감시 피하기, 백준 1759 암호 만들기
3. product() - 데카르트 곱 (중복 순열)
from itertools import product
# 예시: [1, 2]와 [3, 4]에서 각각 1개씩 뽑아 가능한 모든 조합
for p in product([1, 2], [3, 4]):
print(p)
# (1, 3)
# (1, 4)
# (2, 3)
# (2, 4)
# 또는 같은 리스트 반복
for p in product([1, 2], repeat=2):
print(p)
# (1, 1)
# (1, 2)
# (2, 1)
# (2, 2)
📌 활용 문제: 중복 가능한 숫자 고르기, 완전탐색, 사칙연산 시뮬레이션
예: 연산자 끼워넣기 (백준 14888)
4. combinations_with_replacement() - 중복 조합 (순서 X, 중복 O)
from itertools import combinations_with_replacement
# 예시: [1, 2]에서 중복 허용해 2개 조합
for c in combinations_with_replacement([1, 2], 2):
print(c)
# (1, 1)
# (1, 2)
# (2, 2)
📌 활용 문제: 중복 동전 조합, 무한 공급 아이템 구성
예: 동전 2 (백준 2294), 중복 집합 구성
5. accumulate() - 누적합 계산
from itertools import accumulate
# 예시: 누적합 계산
from operator import mul
print(list(accumulate([1, 2, 3, 4]))) # [1, 3, 6, 10]
print(list(accumulate([1, 2, 3, 4], mul))) # [1, 2, 6, 24]
📌 활용 문제: 구간합, 최댓값 누적, DP 보조 계산
예: 누적 거리 계산, 연속된 수 계산
6. groupby() - 연속된 값 그룹화
from itertools import groupby
# 예시: 같은 값이 연속된 그룹 묶기
for key, group in groupby('AAABBBCCDAA'):
print(key, list(group))
# A ['A', 'A', 'A']
# B ['B', 'B', 'B']
# C ['C', 'C']
# D ['D']
# A ['A', 'A']
📌 활용 문제: 정렬 후 카운팅, 연속된 수 묶기
예: 압축, 연속된 방문자 그룹 세기
'IT > 알고리즘 코딩' 카테고리의 다른 글
파이썬 딕셔너리, 제대로 알자. 해시 구조부터 실전 까지 (1) | 2025.06.26 |
---|---|
코딩테스트에서 re 모듈(정규표현식)은 꼭 써야 할까? (1) | 2025.06.24 |
[코테] set (0) | 2025.06.15 |
[코테] Counter (0) | 2025.06.15 |
알고리즘 코딩 테스트, 최근에는 어떻게 바뀌고 있을까? (1) | 2025.05.20 |