

from itertools import permutations
def solution(numbers):
# numbers의 조합을 통해 만들 수 있는 숫자를 저장할 리스트
answer = []
# numbers의 길이를 n 으로 설정하고
# 1자리부터 n자리 까지 모든 순열 permutations을 생성
for i in range(1, len(numbers) + 1):
# permutations(number, i) 는 numbers의 문자들을 i개씩 (i자리수) 뽑은 순열을 생성함
for j in permutations(numbers, i):
# ex) numbers 가 "17"이면 i = 1일때 ('1'), ('7')
# i = 2일때, ('1', '7'), ('7', '1')가 생성됨
# 생성된 튜플을 ''.join(j)로 문자열을 만들고, int로 숫자로 변형
num = int(''.join(j))
answer.append(num)
# 소수 판별 알고리즘
def is_prime(n):
if n < 2 : # 0, 1은 소수가 아님
return False
else:
# n의 제곱근까지만 검사
for i in range(2, int(n**0.5)+1):
if n % i == 0:
return False # 나머지가 0이면 소수가 아님
return True
# answer의 중복 삭제
answer = list(set(answer))
print(answer)
count = 0
for k in answer:
if is_prime(k):
count += 1
return count
모듈 임포트 및 목표
from itertools import permutations itertools 모듈에서 permutations 함수를 가져옵니다. permutations는 주어진 iterable(여기서는 문자열 numbers)에서 순서가 고려된 모든 가능한 순열(배열)을 생성해 줍니다.numbers에 있는 숫자 조각들을 조합하여 만들 수 있는 모든 정수를 구한 뒤, 그 중 소수(prime)가 몇 개인지 세어 반환합니다.후보 생성 단계
answer = [] set을 사용하여 중복을 제거합니다.for i in range(1, len(numbers) + 1): numbers의 길이가 2라면 i은 1과 2가 됩니다.for perm in permutations(numbers, i):) numbers의 문자들을 i개씩 뽑은 순열을 생성합니다.numbers가 "17"일 때,('1',)와 ('7',)('1', '7')와 ('7', '1')''.join(j)으로 튜플에 담긴 문자들을 하나의 문자열로 연결합니다.int(''.join(j))를 통해 문자열을 정수로 변환합니다.answer 리스트에 추가합니다."17"으로부터 1, 7, 17, 71이라는 숫자들이 집합에 저장됩니다.소수 판별 함수 (is_prime)
if n < 2: return False for i in range(2, int(n ** 0.5) + 1): return False 합니다.return True 합니다.소수 개수 세기
count = 0으로 초기화한 후, answer 리스트에 있는 각 숫자에 대해 is_prime 함수를 호출합니다.count를 1씩 증가시킵니다.최종 반환
numbers의 각 자리 숫자로 만들 수 있는 모든 순열(즉, 가능한 모든 숫자 조합)을 쉽게 생성할 수 있습니다.set)을 사용합니다.itertools.permutations는 Python의 내장 모듈인 itertools에 포함된 함수로,
주어진 iterable(반복 가능한 객체)의 모든 가능한 순열(permutaion)을 생성해 줍니다.
여기서 순열(permutation) 이란, 주어진 요소들을 순서에 따라 배열한 모든 경우를 의미합니다.
예를 들어, [1, 2, 3]이라는 리스트가 있을 때,
이들로 만들 수 있는 순열은 다음과 같습니다:
길이 3(전체 요소 사용):
(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)
만약 길이가 2인 순열을 원한다면,
(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)
와 같이, 2개씩 뽑은 모든 순서 있는 조합이 생성됩니다.
itertools.permutations의 기본 문법은 다음과 같습니다:
itertools.permutations(iterable, r=None)
len(iterable)의 순열, 즉 모든 요소를 사용하는 순열을 생성합니다.from itertools import permutations
data = [1, 2, 3]
all_perms = list(permutations(data))
print(all_perms)
출력 결과:
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
permutations(data)는 [1, 2, 3]의 모든 3-순열을 생성합니다.from itertools import permutations
data = [1, 2, 3]
perm_2 = list(permutations(data, 2))
print(perm_2)
출력 결과:
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
[1, 2, 3]에서 2개씩 뽑은 순열만 생성합니다.재귀 또는 백트래킹(Backtracking) 기반
[1, 2, 3]의 전체 순열을 만드는 경우,[2, 3]에 대해 재귀적으로 순열 생성최적화 및 C로 구현
itertools의 함수들은 C로 최적화되어 구현되어 있으므로, Python 코드로 직접 순열을 재귀 호출하는 것보다 매우 빠르고 메모리 효율적입니다.문제 상황:
문자열 "17"이 주어지면,
각 자리 숫자들을 이어 붙여 만들 수 있는 모든 정수를 구하고 싶을 때 사용할 수 있습니다.
from itertools import permutations
numbers = "17"
candidates = set() # 중복을 제거하기 위해 set 사용
# 1자리부터 전체 길이까지 모든 순열 생성
for r in range(1, len(numbers) + 1):
for perm in permutations(numbers, r):
num = int(''.join(perm))
candidates.add(num)
print(candidates)
출력 결과:
{1, 7, 17, 71}
permutations(numbers, r)를 사용하여 1자리, 2자리 순열을 각각 생성하고,''.join(perm)로 튜플을 문자열로 바꾼 후, int()로 정수로 변환합니다.set을 사용해 중복되는 경우(예: "011" → 11)도 자연스럽게 제거됩니다.itertools.permutations는 주어진 iterable에서 순서를 고려한 모든 가능한 순열을 생성해 주는 매우 강력한 도구입니다.