코테준비/Programmers

소수 찾기(순열 이용)

쫑쫑JJONG 2022. 9. 19. 11:57
728x90

순열을 이용한 완전 탐색 + set 이용

from itertools import permutations as P
def solution(numbers): #ex) [0,1,2,5,7,9]
    ans_set = set()
    make = []
    count = 0
    for i in range (1,len(numbers)+1): #모든 순열의 경우의 수를 추가
        make += list(P(numbers,i)) #[( , , ), ( , , ), ( , , )]
    for tup in make:
        s_num = int("".join(map(str,tup))) #숫자로 바꿔주기
        if s_num == 2 : ans_set.add(s_num) #2는 예외 처리 
        for div in range (2,s_num): #(1,2는 위에서 처리)
            count = 1
            if s_num % div == 0: #나누어 떨어진다면
                count = 0
                break
        if count == 1:
            ans_set.add(s_num)
            count = 0
    return len(ans_set)

에라토스테네스의 체

 

  1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
  2. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
  3. 자기 자신을 제외한 2의 배수를 모두 지운다.
  4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
  5. 자기 자신을 제외한 3의 배수를 모두 지운다.
  6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
  7. 자기 자신을 제외한 5의 배수를 모두 지운다.
  8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
  9. 자기 자신을 제외한 7의 배수를 모두 지운다.
  10. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
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)) #0,1 빼주기
    for i in range(2, int(max(a) ** 0.5) + 1): #약수는 대칭 적이므로
        a -= set(range(i * 2, max(a) + 1, i)) # step을 i 를 주어 배수들을 전부 빼줌 
    return len(a)

 

728x90