한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
numbers | return |
---|---|
"17" | 3 |
"011" | 2 |
range(1 ~ len(numbers) + 1)
을 반복하며 모든 경우 탐색int(' '.join(경우의 수))
로 정수로 변환prime_nums
에 추가not_nums
에 추가len(prime_nums)
을 통해 소수의 개수 반환# 코드
from itertools import permutations
def solution(numbers):
answer = 0
# numbers에는 같은 숫자가 반복될 수 있으므로
# 완성된 수를 검사 후 리스트에 담아준다.
prime_nums = [] # 소수인 경우
not_nums = [0, 1] # 소수가 아닌 경우
# 0, 1은 기본적으로 소수가 될 수 없다.
# 1개를 뽑는 경우 ~ len(numbers)개를 뽑는 경우를 모두 조사한다.
for i in range(1, len(numbers) + 1):
# permutations로 모든 경우를 찾는다.
for p_nums in permutations(numbers, i):
# join으로 연결 후 int형으로 변환
val = int(''.join(p_nums))
flag = True
# prime_nums, not_nums에 포함되지 않은 경우 소수인지 확인
if val not in prime_nums and val not in not_nums:
for j in range(2, val // 2 + 1):
if val % j == 0:
flag = False
break
# 소수인 경우 prime_nums에 추가
if flag:
prime_nums.append(val)
# 소수가 아닌 경우 not_nums에 추가
else:
not_nums.append(val)
# (prime_nums의 길이) : 소수의 개수
answer = len(prime_nums)
return answer