한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
[제한사항]
numbers는 길이 1 이상 7 이하인 문자열입니다.
numbers는 0~9까지 숫자만으로 이루어져 있습니다.
013은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
Input = ['17', '011']
Output = [3, 2]
from itertools import permutations
def solution(numbers):
answer = 0
nums = []
[nums.extend(list(permutations(numbers, i+1))) for i in range(len(numbers))]
for n in set(list(map(lambda x : int(''.join(x)), nums))):
if n == 2 or n == 3:
answer += 1
for i in range(2, n+1):
if n % i == 0:
break
else:
if int(n / 2) == i:
answer += 1
return answer
숫자로 이루어진 input 문자열의 조합을 통해 소수의 개수를 구하는 문제이다. 먼저 주어진 문자의 모든 조합을 itertools의 permutations을 사용해서 구할 수 있다. [1, 1, 0]이라는 같은 원소를 가지고 있어도 110과 101은 다른 숫자이기 때문에 itertools의 combinations가 아닌 permutations를 사용해야 한다.
그리고 모든 조합의 경우를 숫자로 만든 다음 하나씩 소수인지 아닌지 확인하면 된다. 2와 3은 무조건 소수이기 때문에 소수인지 확인하는 과정을 거칠 필요가 없고 4이상인 숫자부터 소수를 확인하는 과정을 거치게 된다.
소수를 확인하는 과정은 간단하다. 해당 원소가 가지고 있는 약수가 있는 경우, 약수로 나누게 되면 나머지가 0이 된다. 약수는 중간 지점으로부터 대칭이기 때문에 원소의 절반까지만 나머지가 0이 나올때까지 확인하면 소수 여부를 알 수 있다.