본문 바로가기

카테고리 없음

릿코드, 프로그래머스 - 소수찾기

from itertools import permutations
import math
def isPrime(num) : 
    if num ==2 : return True
    until = math.ceil(math.sqrt(num))
    for i in range(2, until+1) : 
        if num % i == 0 :
            return False
    print(num)
    return True

def solution(numbers):
    answer = 0
    comb = set()
    
    myLen = len(numbers)
    for i in range(1, 2**myLen) :
        a = f'{int(bin(i)[2:]):0{myLen}}'
        tmp = []
        for idx, i in enumerate(a):
            if i == '1': 
                tmp.append(numbers[idx])
        comb.add(''.join(tmp))
        
    comb = list(comb)
    for i in range(len(comb)):
        comb[i] = list(comb[i])
    
    
    combAll = set()
    for num in comb : 
        #num 가지고 조합 만들기.
        a = filter(lambda x : x > 1,map(lambda x : int(''.join(x)), list(permutations(num, len(num)))))
        for i in a : 
            combAll.add(i)
            
    for i in list(combAll) : 
        if isPrime(i) : 
            answer += 1
    
    return answer

숫자 카드가 3개 -> 3자리의 이진수 생성

001, 010, 011, 100, 101, 110, 111 의 위치에 있는 숫자들 뽑아서 각각의 순열 생성 = combAll (지금보니 변수명이... 순열이라 permutation 이 들어간 변수명이 더 맞다)

combAll에 들어있는 숫자들 각각 소수인지 확인. 여기서 약간 시간 잡아먹었다. 쌩기초 문제인데 왜안되지???? 하면서.. 코드를 다시보니 소수인지 확인하는 isPrime함수는 math.ceil로 인해 루트값에 올림처리를 해버려서 2가 들어오면 소수가 아니라고 해버린다.... 올바른 코드는 int(math.sqrt) 이다.

def isIt(num) : 
    for i in range(2, int(math.sqrt(num)) + 1) : 
        if num % i == 0 :
            return False
    return True