코테준비/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)
에라토스테네스의 체
- 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
- 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
- 자기 자신을 제외한 2의 배수를 모두 지운다.
- 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
- 자기 자신을 제외한 3의 배수를 모두 지운다.
- 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
- 자기 자신을 제외한 5의 배수를 모두 지운다.
- 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
- 자기 자신을 제외한 7의 배수를 모두 지운다.
- 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
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