알고리즘
[프로그래머스 고득점 Kit] (완전 탐색) 소수 찾기
김치말이삼겹살
2024. 3. 6. 01:47
접근 방식
# 문자열 리스트로 쪼개기 -> list(string)
# 문자열 iteration-> 1, 17, .. 과 같은 방식 어떻게 처리하지? (permutations)
from itertools import permutations (s에 주목)
문자열의 개수만큼 n번 permutations를 수행하며 우리가 원하는 총 문자열 얻어야 -> 반복문 쓰기
#isPrime 함수 구현하는 데에서 실수 -> 0과 1을 처리 안해줘서 에러가 떴었음 : 이 문제는 디버깅하며 잡았다.
from itertools import permutations
def isPrime(num):
if num ==1 or num==0:
return False
for i in range(2,num):
if num%i==0 :
return False
return True
def solution(numbers):
n = list(numbers)
# print(n)
ans = []
for i in range(1,len(n)+1):
a=list(permutations(n,i))
for j in range(len(a)):
if isPrime(int(('').join(a[j]))):
ans.append(int(('').join(a[j])))
# a = permutations(n,len(n))
# print(('').join(list(a)[0]))
# print(set(ans))
answer = len(set(ans))
return answer
아래는 깔끔한 다른 사람들 풀이
중복되는 수가 없게 or 연산을 수행하며 set을 늘려나가는 게 포인트
그리고 0부터 1까지 원소를 없애준다.
그리고 prime을 처리하기 위한 반복문을 바로 처리하는데, 2부터 전체 경우의 수 중 가장 큰 값의 루트 +1까지의 범위에서 반복하며 i의 2배부터 max(a)까지 iteration을 돌며 i의 배수를 삭제해주는 코드를 구성하셨다.
왜 가장 큰 값의 루트까지 값을 갖도록 하는지 이해할 수 있었다.
결국 가장 큰 값의 루트부터 계속 곱하다보면 가장 큰 값까지 제거할 수 있기 때문이다.
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):
# i의 배수 제거
a -= set(range(i * 2, max(a) + 1, i))
return len(a)
반응형