https://school.programmers.co.kr/learn/courses/30/lessons/42839
❗ permutations 활용, 소수 판별 함수 만들기
👉🏻 소수 판별과 순열들을 하나의 문자열로 만드는 부분이 비효율적인 것 같음..
import itertools set=[1,2,3] #순열 data1= itertools.permutations(set,2) #[(1,2),(1,3),(2,1),(2,3),(3,1),(3,2)] #조합 data2=itertools.combinations(set,2) #[(1,2),(1,3),(2,3)]
import itertools, math
def prime(number):
number=int(number)
n=int(math.sqrt(number))+1
if number<=1:
return False
if number==2:
return True
for i in range(2,n+1):
if number%i==0:
return False
return True
def solution(numbers):
answer = 0
temp=[i for i in numbers]
li=[]
li_2=[]
for i in range(1,len(numbers)+1):
li+=list(itertools.permutations(temp,i))
for i in li:
t=''
for j in i:
t+=j
t=int(t)
if t!=0 and t not in li_2:
li_2.append(t)
for i in li_2:
if prime(i):
answer+=1
return answer
❗ 다른 사람의 풀이 참고
import itertools, math
def prime(number):
n=int(math.sqrt(number))+1
if number<=1:
return False
if number==2:
return True
for i in range(2,n+1):
if number%i==0:
return False
return True
def solution(numbers):
answer = 0
temp=[i for i in numbers]
li=[]
for i in range(1,len(temp)+1):
li+=map(int,(map("".join,itertools.permutations(temp,i))))
li=set(li)
for i in li:
if prime(i):
answer+=1
return answer
해당 문제에선 주어진 수가 특정 범위 내의 수가 아니라 사용하지 않았지만 유용하게 사용됨
에라토스테네스의 체
- 특정 범위의 수를 소수를 한번에 판별하는 방법
- 소수를 판별할 수들을 배열에 할당
- 2부터 시작하여 특정 숫자의 배수에 해당하는 숫자들을 차례로 지움
(2의 배수 지우기, 3의 배수 지우기, 4의 배수(2의 배수에 해당되므로 이미 지워짐) X, 5의 배수 지우기...n=100 list=[True]*(n+1) m=int(n**0.5) for i in range(2,m+1): if list[i]==True: for j in range(i+i,n+1,i): list[j]=False list=[i for i in range(2,n+1) if list[i]==True] #list에는 소수만 남게 됨