[프로그래머스 - 완전 탐색] 소수 찾기

    🔍문제

    문제 설명

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

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

    제한사항

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

    입출력 예

    nubmers return
    "17" 3
    "011" 2

     

    입출력 예 설명

    예제 #1

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

    예제 #2

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

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

    💡 풀이 과정

    1. 문자열을 리스트 각각 잘라서 넣는다
    2. 모든 숫자 조합을 만든다 → permutation 이용
    3. 순열을 숫자로 저장한다
    4. 숫자를 소수인지 확인하고 소수라면 answer 배열에 넣는다
    from itertools import permutations
    import math
    
    def solution(numbers):
        answer = set()
        num = list(numbers)
        temp = []
        
        for i in range(1, len(num)+1):
            temp += list(permutations(num, i)) 
        number_list = [int(''.join(j)) for j in temp] 
        
        for i in number_list:
            if i == 0 or i == 1:
                continue
            else:
                for j in range(2, i):
                    if i % j == 0:
                        continue
                    else:
                        answer.add(i)
        
        return len(answer)

     

    🚨 잘못된 소수 판별

    continue와 else의 사용이 잘못되어 소수가 아닌 경우도 answer에 추가할 수 있다.

    소수인지 판별하는 불리안 변수를 선언하여 코드를 수정하였다.

    for i in number_list:
            if i == 0 or i == 1:
                continue
            is_prime = True
            for j in range(2, i):
                if i % j == 0:
                    is_prime = False
                    break
            if is_prime == True:
                answer.add(i)

     

    🌟 중간 코드

    from itertools import permutations
    import math
    
    def solution(numbers):
        answer = set()
        num = list(numbers)
        temp = []
        
        for i in range(1, len(num)+1):
            temp += list(permutations(num, i)) 
        number_list = [int(''.join(j)) for j in temp] 
        
        for i in number_list:
            if i == 0 or i == 1:
                continue
            is_prime = True
            for j in range(2, i):
                if i % j == 0:
                    is_prime = False
                    break
            if is_prime == True:
                answer.add(i)
        
        return len(answer)

     

     

    🐾 코드 리팩토링

    소수 판별을 제곱근까지만 해도 괜찮다는 것을 발견하였다. 

    for j in range(2, int(math.sqrt(num)+1))

    지난 코드와 비교해봤을 때, 시간이 줄어든 것을 확인할 수 있었다.

     

    🌟 최종 코드

    from itertools import permutations
    import math
    
    def solution(numbers):
        answer = set()
        num = list(numbers)
        temp = []
        
        for i in range(1, len(num)+1):
            temp += list(permutations(num, i)) 
        number_list = [int(''.join(j)) for j in temp] 
        
        for i in number_list:
            if i < 2 :
                continue
            is_prime = True
            for j in range(2, int(math.sqrt(i)+1)):
                if i % j == 0:
                    is_prime = False
                    break
            if is_prime:
                answer.add(i)
        
        return len(answer)

    댓글