루나의 TIL 기술 블로그

프로그래머스 level 2 소수찾기

|

걸린 시간 : 3시간

문제 설명

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

각 종이 조각에 적힌 숫자가 적힌 문자열 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]를 만들 수 있습니다.

사고 과정

주어진 숫자들의 순열로 만든 숫자를 리스트에 저장한다. 그 중 소수를 찾아서 소수의 갯수를 출력한다.

import itertools
from itertools import permutations
#순열(반복 가능한 객체에 대해서 중복을 허용하지 않고 r개를 뽑아서 나열한다)
import math

def solution(numbers):
    nums=[]
    nums = list(str(numbers))
    arr2=[]
    for i in range(1,len(nums)+1):
        arr=[]
        arr = list(map(''.join, itertools.permutations(nums, i)))
        for i in arr:
            arr2.append(i)

    arr3=[]
    arr3 = list(map(int, arr2))
    #01인 경우 1로 바꿔줌
    arr3 = list(map(str,arr3))
    #set을 하기 위해서 문자로 바꿔줌
    arr3 = set(arr3)
    #iterate하기 위해서 다시 숫자로 바꿔줌
    arr3 = list(map(int, arr3))

    def isPrime(n): 
        if n == 1 or n==0:
            return False
        for div in range(2,int(math.sqrt(n))+1):
            if n%div == 0:
                return False
        return True

    answers = []
    
    for i in arr3:
        if isPrime(i):
            answers.append(i)

    return len(answers)

처음에 1,4,10,12 번이 실패해서 앞에 01 이렇게 0이 들어가는 수에서 앞의 0을 지워주는 구문을 넣었다.

모범 답안

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

가능한 수를 a에 저장하고 에라토스테네스 체를 사용해서 a에서 제거했다. a |= 이건뭘까?? ㅋㅋㅋㅋ

주요 포인트 및 생각해볼 점

내 코드는 흐질구질하지만 일단 통과했으니 다음에 다시 와서 살펴보기로 하겠다.