소수 찾기 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/42839
Summary
소수 판별 및 순열 생성 문제
한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.
[제한사항]
[입출력 예]
numbers | return |
---|---|
"17" | 3 |
"011" | 2 |
- 혼자서 문제를 해결
- 힌트를 보고 해결
- 답을 보고 해결
def isPrime(num):
if num < 2:
return 0
elif num == 2:
return 1
for i in range(2, int(num**0.5)+1):
if num%i == 0:
return 0
return 1
def permutation(arr, n):
result = []
if n == 0:
return ' '
for i, elem in enumerate(arr):
for P in permutation(arr[:i]+arr[i+1:],n-1):
result += [elem+P]
return result
def solution(numbers):
answer = 0
perms = []
for i in range(1, len(numbers)+1):
perms += [int(p) for p in permutation(numbers, i)]
for p in set(perms):
answer += isPrime(p)
return answer
from itertools import permutations
def isPrime(n):
for i in range(2, int(n**0.5)+1):
if n % i == 0:
return False
return True
def solution(numbers):
answer = 0
generated = []
for i in range(1, len(numbers)+1):
for comb in permutations(numbers, i):
generated.append(int(''.join(comb)))
for gn in set(generated):
if gn not in [0,1] and isPrime(gn):
answer += 1
return answer
set()
에 숫자를 바로 추가하여 중복을 제거함 primeSet = set()
def isPrime(number):
if number in (0, 1):
return False
for i in range(2, number):
if number % i == 0:
return False
return True
def makeCombinations(str1, str2):
if str1 != "":
if isPrime(int(str1)):
primeSet.add(int(str1))
for i in range(len(str2)):
makeCombinations(str1 + str2[i], str2[:i] + str2[i + 1:])
def solution(numbers):
makeCombinations("", numbers)
answer = len(primeSet)
return answer
set
에서 0,1을 제거 후, 에라토스테네스의 체를 적용하여 소수가 아닌 수들을 set
에서 제거from itertools import permutations
def solution(n):
a = set()
for i in range(len(n)):
a |= set(map(int, map("".join, permutations(list(n), i + 1))))
a -= set(range(0, 2))
for i in range(2, int(max(a) ** 0.5) + 1):
a -= set(range(i * 2, max(a) + 1, i))
return len(a)
소수 판별법과 itertools 라이브러리를 알고 있다면 크게 어려운 문제는 아니었다.
하지만 효율성을 고려하면 직접 기능을 구현하는 것이 유리하기 때문에 순열 부분의 코드를 직접 작성했다.
재귀를 이용해야겠다는 생각은 들었지만, 막상 짜려고 하니 잘 안돼서 서치를 통해 힌트를 얻었다.
set()
의 새로운 기능을 알게 되었다.
set()
에 원하는 숫자를 추가(더하기)만 해도 중복을 알아서 제거해줌Answer sheet에 첫번째 코드 처럼, 만들어진 수를 바로 소수인지 판별하여 저장해두면 나중에 순회를 거치는 번거로움을 피할 수 있다.
효율적인 코딩을 할 수 있도록 계속 고민해보는 연습이 필요하다.