프로그래밍/Algorithm

프로그래머스 소수 찾기 파이썬

모지사바하 2021. 11. 18. 15:40

https://programmers.co.kr/learn/courses/30/lessons/42839

 

코딩테스트 연습 - 소수 찾기

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

programmers.co.kr

 

크게 어려운 문제는 아니였던듯 한데,, 내가 푼 방법이 효율적이라고는 말하지 못하겠다.

 

내 풀이는 아래와 같다.

 

1. 숫자의 길이만큼 루프를 돌린다.

 

2. 예를들어 1234 면 1자리로 나올수 있는 조합부터 4자리로 나올수 있는 모든 조합을 itertools 의 permutations 를 통해서 구한다.

 

3. 가능한 모든 조합을 순회하면서 소수여부를 판단하기 위해 3 부터 조합한 숫자까지 루프를 돌린다

 

4. 이때 조합한 숫자가 2라면 무조건 소수이니 소수값에 저장하고 3부터 조합한 숫자까지 루프를 돌리는데 짝수면 무조건 소수가 아니기 때문에 홀수로만 나눈다.

 

5. 조합된 수와 홀수를 나눴을때 나눠떨어지면 소수가 아니므로 바로 소수판단 루프를 종료한다.

 

6. 소수로 저장된 list 의 중복을 제거하기 위해 set 에 저장한다.

 

7. 중복이 저장된 소수값들의 길이를 출력한다.

 

 

import itertools


def solution(numbers):
    temp = []
    for i in range(1, len(numbers) + 1):
        nPr = itertools.permutations(numbers, i)
        for j in nPr:
            num = int(''.join(j))

            if num == 2:
                temp.append(2)
            elif not (num == 0 or num == 1):
                is_prime = True
                if num % 2 == 0:
                    is_prime = False
                else:
                    for k in range(3, num, 2):
                        if num % k == 0:
                            is_prime = False
                            break

                if is_prime:
                    temp.append(num)
    return len(set(temp))