[Py_Lv2] 소수 찾기

Sunghun📈·2021년 10월 8일
0

프로그래머스

목록 보기
63/93
post-thumbnail

문제 설명

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

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

제한 사항

  • numbers는 길이 1 이상 7 이하인 문자열입니다.
  • numbers는 0~9까지 숫자만으로 이루어져 있습니다.
  • "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.

입출력 예

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

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

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

접근법

소수 : 1을 제외한 수 중 1과 본인 자신으로만 나눠지는 수

소수를 구하는 방법은 어렵지 않다

하지만 여기서 문제를 어렵게 만드는 것은 모든 경우의 수를 추출하는것이다.

여기서 아주아주 유용하게 사용되는 함수가 있다.

itertools 라이브러리에 permutations()이다.

permutations(문자열 또는 리스트, 숫자) 숫자만큼 분리하여 다양한 조합을 자동으로 만들어 주는 아주 아주 좋은 함수이다.

combi.extend를 거치면 아래와 같은 결과가 나온다
[["1"],["7"],["1","7"],["7","1"]]

result = [int(''.join(i)) for i in combi]를

통해 [1,7,17,71]을 얻을 수 있다.

예제 2에서 "011"의 경우
실제로 "011"조합이 나올 수 있는데 이건 int()로 변환하면 0이 자동으로 사라지게되므로 걱정할것이 없다. 또 11과 011의 경우 set()함수를 통해 중복값을
없앨 수 있다.

=============================================================

from itertools import permutations

def primary(n):
    
    if n < 2:
        return False
    else:
        for i in range(2, n//2 + 1):
            if n%i == 0:
                return False
    return True

def solution(numbers):
    answer = 0
    combi = []
    result = []
    
    for i in range(1,len(numbers)+1):
        combi.extend(permutations(numbers,i))
        result = [int(''.join(i)) for i in combi]
    
    for i in set(result):
        if primary(i):
            answer+=1
            
    return answer)
profile
데이터 분석과 AI 분야의 전문가를 꿈꾸는 청년

0개의 댓글