[Programmers] level2 - 소수 찾기

문제 설명

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.

각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

제한사항
  • numbers는 길이 1 이상 7 이하인 문자열입니다.
  • numbers는 0~9까지 숫자만으로 이루어져 있습니다.
  • 013은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
입출력 예
numbersreturn
173
0112
입출력 예 설명

예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.

예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.

  • 11과 011은 같은 숫자로 취급합니다.


풀이

python itertools의 permutations를 사용하면 빠르게 풀 수 있다. 
흐름은 알겠는데 깨끗하게 작성하지를 못했다. 
문자열로 입력받은 numbers를 list()를 사용해 한 글자씩  분리 시킨 리스트를 만든다. 문자열의 길이만큼 순열을 생성하면 종이 조각으로 만들 수 있는 모든 숫자 조합이 만들어진다. 조합 튜플들을 하나의 문자열로 묶고 int() 메서드로 정수화 시키면 0으로 시작하는 숫자들이 정리된다.
set()으로 중복을 제거하고 정리된 리스트의 원소들을 isPrime() 메서드로 소수인지 판별하여 최종적으로 그 갯수를 리턴했다.
                                                                     

from itertools import permutations
def solution(numbers):
    numbers = list(numbers)
    num = []
    for i in range(1len(numbers)+1):
        num.append(permutations(numbers,i))
    res = []
    for n in num:
        for tups in n:
            res.append(int(''.join(tups)))
    res = list(set(res))
    count = 0
    for r in res:
        if isPrime(r):
            count+=1
    return count
 
def isPrime(n):
    if n<2:
        return False
    for i in range(2,int(n**0.5)+1):
        if n%i == 0:
            return False
    return True
cs

map을 중첩해서 사용한다는 생각을 못해서 코드가 길어진 것 같다.

다른 사람이 푼 멋진 풀이법

from itertools import permutations
def solution(numbers):
    a=set()
    for i in range(1,len(numbers)+1):
        a |= set(map(int,map(''.join,permutations(list(numbers),i))))
    a -= set(range(0,2))
    for i in range(2int(max(a) ** 0.5)+1):
        a -= set(range(i*2, max(a)+1, i))
    return len(a)
cs



permutations를 사용하고 전체적인 흐름은 똑같은데 나는 set을 활용할 줄 몰라서 list로 비효율적으로 풀었고 이 풀이는 set을 최대한으로 활용한 멋진 풀이이다. 
에라토스테네스의 체 또한 set을 사용해 간단하게 풀이했다.
나도 에라토스테네스의 체를 사용하려 했으나, 나는 중복을 제거한 각 숫자들에 대해 체를 만들고, 소수인지 판별하고 하다보니 당연하게도 시간초과가 발생했다. 

No comments:

Powered by Blogger.