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