한자리 숫자가 적힌 종이 조각이 흩어져있습니다.
흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한 사항
- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
numbers | return |
---|---|
"17" | 3 |
"011" | 2 |
입출력 예 설명
- 예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.- 예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.- 11과 011은 같은 수로 취급합니다.
- 입력받은 numbers를 리스트로 재생성한다.
- 1개의 조합부터 생성된 리스트의 길이만큼의 조합이 나타날 수 있기 때문에 반복문을 통해 돌려준다.
- permutations 함수를 사용해서 각 조합별로 쭉 나열해주고 소를 판별해서 answer로 count 한다.
from itertools import permutations
import math
# 아래 함수보다 효율적인 함수
def is_prime(num):
# 제곱근까지 확인하면서 미리 값을 쳐낼 수 있다.
for i in range(2, int(math.sqrt(num)) + 1):
if num % i == 0:
return False
return True
def is_prime_2(num):
for i in range(2, num):
if num % i == 0:
return False
return True
def solution(numbers):
sep = [r for r in numbers]
total = []
answer = 0
for i in range(1, len(sep) + 1):
# 순열들을 total 리스트에 나열해주기
total.append(list(map(''.join, permutations(sep, i))))
# 2차원 리스트 이어붙여주고, 모두 int 형으로 형 변환
q = list(map(int, sum(total, [])))
# 중복 제거
q = list(set(q))
for i in q:
if is_prime(i) == True:
answer += 1
return answer
- 새로배운 permutations 함수와 sum의 새로운 사용방법이 있다.
- permutations를 제외하고는 기존에 알던 함수를 사용하는 거라 효율적으로 짤 수 있었다.
- 내가 짰던 코드 중에 가장 파이썬스럽게 생각하고 부드럽게 생각해서 기분이 좋지 않을 수가 없다!
- 이전같으면 count 변수 따로 만들고 answer에 넣어줬을텐데 programmers에 익숙해진 탓인지 그러한 불필요한 과정도 줄일 수 있다.
- 처음 만든 리스트도 사실상 numbers = list(numbers)로 할 수 있다.