읽기 전
- 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
- 개인적으로 배운 점을 정리한 글입니다.
문제 링크
문제 풀이
풀이에 앞서 사전 작업이 조금 필요하다.
- 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 |