문제 설명
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
제한사항
- numbers는 길이 1 이상 7 이하인 문자열입니다.
- numbers는 0~9까지 숫자만으로 이루어져 있습니다.
- "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.
입출력 예
풀이
종이 조각들로 이어붙여서 만들 수 있는 모든 숫자들을 소수인지 검사하는 방법을 사용했다
먼저 숫자 하나하나를 1~N으로 나눠가며 소수 검증을 한다면 너무 오래 걸리기에
조각을 이어붙여서 나올 수 있는 최대값을 maxNum으로 잡고 1~maxNum의 값들 중 소수가 무엇인지 에라토스테네스로 미리 판별해두었다
그리고 재귀를 통해 만들어지는 숫자 하나하나를 소수검증하여 카운트했다
answer = 0
def solution(numbers):
L = len(numbers)
nums = []
for c in numbers:
nums.append(int(c))
nums.sort(reverse=True)
maxNum = int(''.join(map(str,nums)))
primes = [True]*(maxNum+1)
primes[0], primes[1] = False, False
for i in range(2,maxNum+1):
if primes[i]:
for j in range(i+i, maxNum+1, i):
primes[j] = False
visited = [True]*L
def recur(n):
if len(n) > L:
return
if n != '' and primes[int(n)]:
global answer
primes[(int(n))] = False
answer += 1
for idx in range(L):
if visited[idx]:
visited[idx] = False
recur(n+str(nums[idx]))
visited[idx] = True
recur('')
return answer
'알고리듬' 카테고리의 다른 글
[백준 2116] 주사위 쌓기 (0) | 2024.11.21 |
---|---|
[프로그래머스] 전력망을 둘로 나누기 (0) | 2024.11.21 |
[프로그래머스] 피로도 (0) | 2024.11.18 |
[프로그래머스] 카펫 (0) | 2024.11.17 |
[프로그래머스] 모음사전 (0) | 2024.11.04 |