개발/코딩테스트

[프로그래머스]소수 찾기 - 파이썬(Python)

grulsuitg 2022. 6. 30. 15:15

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42839

 

코딩테스트 연습 - 소수 찾기

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이

programmers.co.kr


My Solution

import math
from itertools import permutations

def solution(numbers):
    answer = 0
    numbers = list(numbers)
    items = set(map(int, numbers))
    for i in range(2, len(numbers) + 1):
        for item in list(permutations(numbers, i)):
            items.add(int(''.join(item)))

    m = max(items)
    prime = [True] * (m + 1)
    prime[0] = prime[1] = False
    for i in range(2, int(math.sqrt(m)) + 1):
        if prime[i]:
            j = 2
            while i * j <= m:
                prime[i *j] = False
                j += 1

    for item in items:
        if prime[int(item)]:
            answer += 1

    return answer

 

Key Idea

  • items 변수에 가능한 조합 저장
    → itertools.permutations를 이용
  • 에라토스테네스의 체를 이용한 소수 판별
    → sqrt(최댓값) + 1 까지 돌면서 소수의 배수를 없애는 방법

 

Best Solution

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)

 

Key Idea

  • 전체적인 아이디어는 나의 풀이와 같다.
  • range를 이용한 set 구현
  • set을 이용해 에라토스테네스의 체를 구현