본 게시물은 프로그래머스의 연습 문제 풀이입니다. 저작권은 (주) 그랩에게 있습니다
파이썬 코드
# 소수 찾기
from itertools import permutations
import math
def solution(numbers):
# numbers를 리스트화
numbers = list(numbers)
# numbers의 길이
numbers_len = len(numbers)
# numbers의 순열
number_per = set()
# 주어진 수로 만들 수 있는 순열
for i in range(1, numbers_len + 1):
# 만들어진 순열을 하나의 문자열로 합쳐서 반환
# -> 정수화
# -> set 자료형으로 중복 제거
number_per |= (
set(map(int, map(''.join, permutations(numbers, i)))))
# 만들어진 순열에서 0, 1을 제외 (소수가 아니므로)
number_per = number_per - {0, 1}
# 가장 큰 수의 제곱근
number_per_max_sqrt = int(math.sqrt(max(number_per)))
for j in range(2, number_per_max_sqrt + 1):
# j를 제외한 j의 배수가 number_per에있으면 소수가 아니다.
number_per -= set(range(j * 2, max(number_per) + 1, j))
return len(number_per)
Comment
순열을 변환할 때 join메소드와 map을 사용해서 원하는 자료형을 바꾸는 것을 알게 되었다. 그 다음에는 에라토스 테네스의 체로 소수를 판별하는 부분에서 계속 시간 초과가 나왔다. 영 풀리지 않아서 검색을 해봤는데, set을 사용해서 중복을 제거하여 효율적으로 푸는 방법이 있었다. 나는 이 전에는 while문으로 매번 일일이 탐색하였기에 시간초과가 나왔던 것이다.
Reference
'programming study > Algorithm' 카테고리의 다른 글
[프로그래머스] 삼각 달팽이 - python 풀이 (0) | 2021.05.19 |
---|---|
[프로그래머스] 순위 검색 - python 풀이 (0) | 2021.05.16 |
[프로그래머스] 카펫 - python 풀이 (0) | 2021.05.01 |
[프로그래머스] 예상 대진표 - python 풀이 (0) | 2021.04.30 |
[프로그래머스] 예상 대진표 - python 풀이 (0) | 2021.04.29 |