읽기 전

  • 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
  • 개인적으로 배운 점을 정리한 글입니다.

문제 링크

Programmers. 소수 찾기

문제 풀이

풀이에 앞서 사전 작업이 조금 필요하다.

  • numbers의 종이를 뽑아 숫자를 만드는 함수(Permutation)
  • 만든 숫자가 소수인지 확인할 에라토스테네스의 체

위 2가지만 구현할 수 있으면 수월히 풀리는 문제였다. 에라토스테네스의 체의 범위는 numbers로 만들 수 있는 최대의 수 + 1로 잡으면 된다. 숫자는 1개부터 numbers의 길이만큼까지 뽑아서 만들 수 있는 수다.

python 코드

def solution(numbers):
    L = len(numbers)
    def permutation(r):
        buf = []
        visited = [0 for _ in range(L)]
        def gen(buf, sol):
            if len(buf) == r:
                s = int("".join(buf))
                if sieve[s] is True:
                    sieve[s] = None
                    sol += 1
                    return sol
            for i in range(L):
                if not visited[i]:
                    buf.append(numbers[i])
                    visited[i] = 1
                    sol = gen(buf, sol)
                    buf.pop()
                    visited[i] = 0
            return sol
        sol = gen(buf, 0)
        return sol
    N = int("".join(sorted(numbers, reverse=True)))
    sieve = [True] * (N + 1)
    sieve[0], sieve[1] = False, False
    for i in range(2, int(N ** 0.5) + 1):
        if sieve[i] is True:
            for j in range(2 * i, N + 1, i):
                sieve[j] = False
    answer = 0
    for i in range(L + 1):
        answer += permutation(i)
    return answer

'Algorithms > Programmers' 카테고리의 다른 글

Programmers. 다리를 지나는 트럭  (0) 2021.08.10
Programmers. 도둑질  (0) 2021.08.10
Programmers. 등굣길  (0) 2021.08.10
Programmers. 큰 수 만들기  (0) 2021.07.22
Programmers. 디스크 컨트롤러  (0) 2021.07.22

+ Recent posts