[Python] 프로그래머스 - 소수 찾기

728x90
반응형

programmers.co.kr/learn/courses/30/lessons/42839

 

코딩테스트 연습 - 소수 찾기

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이

programmers.co.kr

처음에 numbers에 있는 숫자들에 대해 모든 경우의 수를 구해야 한다. 

이 문제를 풀고 나서 다른 사람들의 풀이를 보니 다양한 방법이 존재했다.

나는 itertools모듈의 permutations함수를 사용했다.

 

1. numbers에 있는 숫자를 num배열에 넣고 dab에도 넣어준다. (한자리 수는 따로 처리)

    -> permutations(num, 1)을 하면 [('1', ), '('0', )]이런식으로 뭔가 이상하게 나와서 따로 처리해주었다.(좀 더 공부해봐야 할듯...)


2. i가 2부터 len(numbers)까지 돌며 num배열안에 있는 숫자들 중 i개를 골라 만들 수 있는 모든 경우의 수를 dab에 넣어주었다.

   중복된 수는 필요없으므로 중복을 허용하지 않는 set자료형을 사용했다.

 

3. get_primes()함수는 에라토스테네스의 체 알고리즘을 사용해서 소수를 판별하는 함수이다.

   최대로 들어올 수 있는 수가 9999999이므로 9999999까지 배열을 만들고 소수에 해당하는 인덱스 말고 나머지는 False로 바꿔준다.

 

4. 결국 dab에는 numbers에 있는 수들로 이루어진 모든 경우의 수가 들어가므로 dab배열(?) 안에 있는 수를 돌며

    is_prime[i]가 True이면 소수이므로 cnt에 1을 더해준 뒤 return 해주면 끝

from itertools import permutations
import math
def solution(numbers):
    num, dab = [], set()
    cnt = 0
    def get_primes():
        is_primes = [False, False] + [True] * 9999999
        max_length = math.ceil(math.sqrt(9999999))
        for i in range(2, max_length):
            if is_primes[i]:
                for j in range(i+i, 9999999, i):
                    is_primes[j] = False
        return is_primes
    
    for i in numbers:
        num.append(i)
        dab.add(int(i))
        
    for i in range(2, len(numbers) + 1):
        for k in list(permutations(num, i)):
            tmp = ''
            for j in range(len(k)):
                tmp += k[j]
            dab.add(int(tmp))

    is_prime = get_primes()
    for i in dab:
        if is_prime[i]:
            cnt += 1
            
    return cnt

 

(프로그래머스 level2)

 

# itertools모듈을 좀더 공부해보자!

728x90
반응형
TAGS.

Comments