코딩테스트/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(02))
    for i in range(2int(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