코딩테스트/python
프로그래머스 : 완전탐색 - 소수찾기
엔지니어 규
2023. 1. 19. 20:23
728x90
나의풀이
from itertools import permutations
def comb(numbers):
num_list = []
for i in range(1,len(numbers)+1):
num = list(permutations([x for x in numbers], i))
num_list += ["".join(x) for x in num]
num_list = list(map(int,num_list))
return list(set(num_list))
def determine(x):
if x ==1 or x==0:
return False
if x ==2:
return True
for i in range(2,x):
if x %i == 0:
return False
return True
def solution(numbers):
print(comb(numbers))
print([determine(x) for x in comb(numbers)])
return sum([determine(x) for x in comb(numbers)])
|
cs |
1. permutations 를 이용해서 경우의수를 모두 구한다.
2. determine 함수를 구현해서 소수를 판별한다.
3. 모든 경우의수를 소수판별을 한후 개수를 더한다.
다른풀이
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))
for i in range(2, int(max(a) ** 0.5) + 1):
a -= set(range(i * 2, max(a) + 1, i))
return len(a)
|
cs |
checkpoint1. a |= set()
a = {1,2,3,4,5}
b = {3,4,5,6,7,8,9}
a |= b
a
{1, 2, 3, 4, 5, 6, 7, 8, 9}
위코드에서 a |=b 는 곧 a = a|b 와 같으며, set 에서 중복을 피해서 더할수있는 방법이다.
set은 - 연산자를 사용할 수 있지만, +연산자는 사용할수 없고, 합집합은 '|' , 교집합은 "&" 를 사용한다.
checkpoint2.
int("0023") -> 23 이 출력이된다.
괜히 '0023' 에서 '00' 을 어떻게 빼야할지 고민할 필요가 없다.
checkpoint3.
for i in range(len(n)):
a |= set(map(int, map(''.join, permutations(list(n),i+1)))
전체 경우의수를 구하는 핵심 알고리즘이다.
"".join 은 str 타입만 join 할수있기때문에 사용하기전에 문자열인지 확인을 해야한다.
또한 map 과 같은 call back 함수는 int(), "".join() 에서 괄호를 사용할 필요가 없다.
map( function, iterable) 에서 function 은 괄호를 생략한다.
*iterable 객체란?
list, dict, set, str, bytes, tuple, range 타입 처럼
반복 가능한 객체를 의미한다.
728x90