로또 1등에 당첨되고 싶으면 모든 번호 조합을 하나씩 다 사면 됩니다. 아 근데 그러면 60억 손해래요.
현실에선 이런 방법이 쓸모없지만, 알고리즘 문제를 풀 땐 쓸모있을 때가 꽤 많습니다. 바로 브루트 포스입니다.
itertools로 순열, 조합 계산하기| 기능 | 함수 | 중복 | 순서 | 계산 횟수 |
|---|---|---|---|---|
| 조합 | combinations(a, r) | X | X | |
| 중복조합 | combinations_with_replacement(a, r) | O | X | |
| 순열 | permutations(a, r) | X | O | |
| 중복순열 | product(a, repeat=r) | O | O |
itertools 모듈 함수들의 도움을 받을 수 있음a와, 뽑을 원소 수 r를 인수로 받음for문에서 하나씩 순회 가능한 객체. 리스트, 튜플, 집합, 딕셔너리, 문자열, range() 등from itertools import combinations
a = [1, 2, 3, 4]
result = []
for cmb in combinations(a, 2):
result.append(cmb)
print(f"총 조합 수: {len(result)}")
# [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
# 총 조합 수: 6
a 중에서 원소 r개를 중복 없이, 순서 없이 뽑은 모든 조합을 구함r을 생략하면 에러 발생from itertools import combinations_with_replacement
a = [1, 2, 3, 4]
result = []
for cmb in combinations_with_replacement(a, 2):
result.append(cmb)
print(f"총 중복조합 수: {len(result)}")
# [(1, 1), (1, 2), (1, 3), (1, 4), (2, 2), (2, 3), (2, 4), (3, 3), (3, 4), (4, 4)]
# 총 중복조합 수: 10
a 중에서 원소 r개를 중복을 허용하고, 순서 없이 뽑은 모든 조합을 구함r을 생략하면 에러 발생from itertools import permutations
a = [1, 2, 3, 4]
result = []
for pm in permutations(a, 2):
result.append(pm)
print(f"총 순열 수: {len(result)}")
# [(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]
# 총 순열 수: 12
a 중에서 원소 r개를 중복 없이, 순서를 고려하여 뽑은 모든 순열을 구함r을 생략하면 len(a)로 처리from itertools import product
a = [1, 2, 3, 4]
result = []
# 얘만 repeat을 따로 파라미터로 지정해야 함
for pm in product(a, repeat=2):
result.append(pm)
print(result)
print(f"총 중복순열 수: {len(result)}")
# [(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4), (3, 1), (3, 2), (3, 3), (3, 4), (4, 1), (4, 2), (4, 3), (4, 4)]
# 총 중복순열 수: 16
a 중에서 원소 repeat개를 중복을 허용하고, 순서를 고려하여 뽑는 모든 순열을 구함repeat을 따로 파라미터로 지정해야 함에 유의1N = int(input())
num = 1
count = 0
while True:
if "666" in str(num):
count += 1
if count == N:
print(num)
break
num += 1
6이 3개 이상 연속으로 들어가면 count 1 증가count가 N이 되면 반복 멈추고 해당 num 출력10000을 입력해 보니 2666799이 출력된 걸 봐서, 최대 2666799번 연산이 이루어짐